[问题] string 测试 operator += 有没有存在

楼主: hare1039 (hare1039)   2018-07-15 22:26:02
开发平台(Platform): (Ex: Win10, Linux, ...)
Arch Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
clang 6.0.0
g++ 7.3.1
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
最近在自学 C++ meta programming,碰到这个问题:
测试一个 type 能不能正确的被 std::string += 起来
目前的解法是:
template<typename T>
struct can_string_cat_impl
{
template <typename Operand> // SFINAE out if += not working
static auto test(Operand o) -> decltype(std::declval<std::string>() += o);
template <typename...>
static auto test(...) -> std::false_type;
using type = typename std::is_same<std::string, std::decay_t<decltype(test(std::declval<T>()))>>::type;
};
template <typename T>
struct can_string_cat : can_string_cat_impl<T>::type {};
现在的 code 已经可以做到一部分了,但是因为 int / long / double 等等可以隐式转型成 char
因此 can_string_cat<V>::value 会说上面这些 type 是可以 += 的
但是很明显的,casting 过后,再 += 的结果不是正确的
e.g.
std::string s{"hello "};
int x = 100;
s += x; // s 要是 "hello 100" 而不是 "hello d"
目前想到的解法有
1: 想办法取消隐式转型
2: 把所有有可能隐式转型成 char 的 type 全部写出来,test<int>(), test<double>...
让 compiler 不会选到 template <typename Operand> 的 overload
1 的话现行 C++ 应该是无解
2 的话就像是硬刻 99 乘法表一样,难以维护
想请问高手们有没有更好的解决办法?
谢谢
喂入的资料(Input):
None
预期的正确结果(Expected Output):
string can += on PKc
string cannot += on St6vectorIiSaIiEE
string cannot += on i
string cannot += on l
string cannot += on d
错误结果(Wrong Output):
string can += on PKc
string cannot += on St6vectorIiSaIiEE
string can += on i
string can += on l
string can += on d
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://gist.github.com/hare1039/a94a36be97e6b30d46d4affca60fe833
补充说明(Supplement):
using compiler flag: -O3 -std=c++17 -Wall -Wextra
感谢各路高手帮忙 m(_o_)m
楼主: hare1039 (hare1039)   2018-07-16 13:45:00
感谢 A 大,目前看起来去掉数字 type 还满不错的
作者: AstralBrain   2018-07-16 00:10:00
判断条件加上 (not is_arithmetic_v<T> oris_same_v<T, char>)这样至少可以排除掉char以外的数字type
作者: ibmibmibm (BestSteve)   2018-07-17 16:38:00
记得char,unsigned char, signed char都是不同型态

Links booklink

Contact Us: admin [ a t ] ucptt.com