【发布时间】:2018-10-27 14:28:57
【问题描述】:
我想设计一个模板,它自动为所有类T 提供一个operator<<(std::ostream&, const T&),其中T::print_to(std::ostream&) 存在并且可以调用,这样我就可以将打印函数定义为成员函数(并且,在特别是,利用虚拟呼叫)。
通过反复试验,我设法做到了:
template<typename T, typename = decltype(std::declval<T>().print_to(std::declval<std::ostream&>()))>
std::ostream &operator<<(std::ostream &s, const T &t) {
t.print_to(s);
return s;
}
它似乎有效,但由于我对 SFINAE 和这种技巧还是新手,想知道是否有任何陷阱或改进。我在https://ideone.com/uLJxac放了一个小测试台。
如果可能,我想要一个 C++14 解决方案,因为我正在使用 C++14 代码库。但是,如果使用 C++17 可以提供更好的解决方案,那我也对它感兴趣。
【问题讨论】:
-
@Glovanni Mascellani 实际上,您正在尝试检测
concept...Constraints and concepts (since c++20) 和[约束和概念(TS)](en.cppreference.com/w/cpp/experimental/constraints)值得一看。对于C++17和C++14concept,看看我的回答。 -
为什么这里需要
typename = decltype,我试图删除它,但没有任何改变?
标签: c++ templates operator-overloading c++14 sfinae