根据是否存在某个功能启用模板

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可以提供更好的解决方案,那么对此我也很感兴趣。

max*_*x66 5

在我看来,您正确地在您的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)