Gio*_*ani 4 c++ templates operator-overloading sfinae c++14
我想设计一个模板,该模板自动为存在且可以调用的operator<<(std::ostream&, const T&)所有类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;
}
Run Code Online (Sandbox Code Playgroud)
它似乎正在工作,但是由于我还是SFINAE的新手,所以我想知道是否可以进行任何陷阱或改进。我在https://ideone.com/uLJxac放置了一个小型测试台。
如果可能的话,我想拥有一个C ++ 14解决方案,因为我正在使用C ++ 14代码库。但是,如果使用C ++ 17可以提供更好的解决方案,那么对此我也很感兴趣。
在我看来,您正确地在您的SFINAE中应用了operator<<();在您的解决方案中我看不到任何陷阱。
我提议另一个版本(与C ++ 11兼容,也与C ++ 14兼容),只是因为它需要更少的打字
template <typename T>
auto operator<< (std::ostream & s, T const & t)
-> decltype( t.print_to(s), s )
{
t.print_to(s);
return s;
}
Run Code Online (Sandbox Code Playgroud)