我要对每个有std::string to_string(T)
函数的类型 T,都自动定义std::cout << T
(实现为std::cout << to_string(T)
)。
BOOST_TTI_HAS_MEMBER_FUNCTION
可以检查类是否有指定成员函数,但我没找到如何检查是否有普通函数。
1
GeruzoniAnsasu 2018-08-13 17:27:46 +08:00
没太懂,感觉你这个需求十分奇怪
对于每个不同的 T,必然要实现不同的 to_string(T) ,那实现的时候顺便定义 operator<<(std::cout,T) 不就好了? |
2
zhiqiang OP @GeruzoniAnsasu 有多个 T,单写一个还比较麻烦。
另外我是对每个类 T,自动实现`vector<T>, map<T>, set<T>`等一大堆类型的`to_string`。那每个类型就要手工写四个`operator<<(std::cout,T_T)`。 |
3
bilosikia 2018-08-13 17:57:37 +08:00
首先是 SFINAE, 不是 SNINAE
其实你的需求是要实现重载<<操作符 |
4
geelaw 2018-08-13 18:22:20 +08:00 1
|
5
GeruzoniAnsasu 2018-08-13 18:43:53 +08:00 1
其实我感觉
template <typename T, typename I = decltype(to_string(T()))> decltype(std::cout << 1) operator<<(decltype(std::cout << 1) cout, const T &t) { return cout << to_string(t); } 就行? 对于没有定义 to_string(T)的 T,decltype 会失败 |
6
AngelCriss 2018-08-13 18:48:55 +08:00 via Android
指定成员函数也是要给函数签名的啊,要不然给个函数名就行,那就是编译期反射了
|
7
Bladeindark 2018-08-14 07:22:09 +08:00
……都知道 SNINAE 了,外网不是大把这种 blog 么?
|
8
codehz 2018-08-16 10:46:03 +08:00
几天前还看到有这样的骚操作 https://zhuanlan.zhihu.com/p/41922937
可以模拟 concept 的 requires |
9
429839446 2018-12-13 18:00:50 +08:00
nlohmann/json 的 readme
|