C++ SNINAE 如何判断指定函数是否存在?

2018-08-13 16:52:11 +08:00
 zhiqiang

我要对每个有std::string to_string(T)函数的类型 T,都自动定义std::cout << T(实现为std::cout << to_string(T))。

BOOST_TTI_HAS_MEMBER_FUNCTION可以检查类是否有指定成员函数,但我没找到如何检查是否有普通函数。

2773 次点击
所在节点    C
9 条回复
GeruzoniAnsasu
2018-08-13 17:27:46 +08:00
没太懂,感觉你这个需求十分奇怪

对于每个不同的 T,必然要实现不同的 to_string(T) ,那实现的时候顺便定义 operator<<(std::cout,T) 不就好了?
zhiqiang
2018-08-13 17:39:26 +08:00
@GeruzoniAnsasu 有多个 T,单写一个还比较麻烦。

另外我是对每个类 T,自动实现`vector<T>, map<T>, set<T>`等一大堆类型的`to_string`。那每个类型就要手工写四个`operator<<(std::cout,T_T)`。
bilosikia
2018-08-13 17:57:37 +08:00
首先是 SFINAE, 不是 SNINAE
其实你的需求是要实现重载<<操作符
geelaw
2018-08-13 18:22:20 +08:00
类似 enable_if_t 的用法,自己实现一个不就行了。

https://gist.github.com/GeeLaw/a93e60f05c0257278f36b199d9987f53
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 会失败
AngelCriss
2018-08-13 18:48:55 +08:00
指定成员函数也是要给函数签名的啊,要不然给个函数名就行,那就是编译期反射了
Bladeindark
2018-08-14 07:22:09 +08:00
……都知道 SNINAE 了,外网不是大把这种 blog 么?
codehz
2018-08-16 10:46:03 +08:00
几天前还看到有这样的骚操作 https://zhuanlan.zhihu.com/p/41922937
可以模拟 concept 的 requires
429839446
2018-12-13 18:00:50 +08:00
nlohmann/json 的 readme

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/479398

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX