c++ - 每当表达式未定义时,在 C++ 中启用函数模板

标签 c++ templates c++11 metaprogramming sfinae

只要某些表达式定义(例如,类型tx不是

,是否可以启用函数模板em> 可流式传输到 std::cout)。有点像

template<typename t>
auto f(const t &x) 
  -> typename enable_if_undefined<decltype(std::cout << x)>::type;

使用 SFINAE,我只知道在定义了表达式时如何启用,但不知道在未定义表达式时如何启用。

最佳答案

你需要一个助手来提供一个你可以反转的 bool 值:

template<typename, typename=void>
struct has_cout
    : std::false_type {};

template<typename T>
struct has_cout<T, decltype(std::cout << std::declval<T>(),void())>
    : std::true_type {};

template<typename T>
auto f(const T& x) 
  -> typename std::enable_if<!has_cout<T>::value>::type;

Live example

关于c++ - 每当表达式未定义时,在 C++ 中启用函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30056790/

相关文章:

c++ - c语言中的main()默认返回整数值吗?

c++ - opencv:获取从 gphoto2 传输的一系列图像

c++ - 如何向模板类公开统一接口(interface)?

c++ - Lambda:一个可能悬垂的引用捕获

c++ - 为什么他们会对某些初始化列表进行特殊处理,而不是对它们一视同仁?

c++ - 编译器喊出文本 ">"是意外的 C++ XLC

c++ - 在这种情况下要考虑的有效 C++ 数据结构

email - Grails-通过电子邮件渲染模板

ruby - 模板方法模式,在哪里定义常用函数

c++ - 将普通指针转换到 std::shared_ptr 似乎不起作用