
我要对每个有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 |
5 GeruzoniAnsasu 2018-08-13 18:43:53 +08:00 其实我感觉 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 |