c++ - 模板类型推导

标签 c++ type-deduction

我遇到过class = std::enbale_if<condition, type>::type在模板参数列表中几次,我知道什么std::enable_if<B,T>::type确实但不确定是什么 class =做 ?我是说我知道class type_name = type但为什么 class = 中没有类型名称?我什么时候使用它?

编辑:这个例子来自here

template <class T, class U, class = typename enable_if
          <is_lvalue_reference<T>::value ? is_lvalue_reference<U>::value : true>::type>
inline T&& forward(U&& u)
{
    return static_cast<T&&>(u);
}

最佳答案

这是 SFINAE (替换失败不是错误)。下面是两个示例,其中对 struct 和 class 施加了约束,以禁止使用不正确的类型进行实例化。

but not sure what class = does ? I mean I know class type_name = type but why there is no type name in class = ? when would I use it ?

这是一个未命名的模板参数类型,你可以给它一个名字,但它不是必需的,因为这个参数只在重载结果期间使用(以删除无效的候选者)。实际上给它命名可能会显示警告。

http://coliru.stacked-crooked.com/a/25162a3eb107943f

// Allow only T to be floating type (!! actually static_assert would be preferred here)
template<class T,
         class = typename std::enable_if<std::is_floating_point<T>::value>::type>
struct foo {

};

template <class T,
          class = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even(T i) {return !bool(i%2);}

int main()
{
  // foo<int> f;  //error
  foo<float> f;   //ok

  //is_even(1.1); //error
  is_even(1); //ok

  return 0;
}

[编辑]

我必须说上面的例子不是最好的,建议使用 static_assert,因为它可以生成信息性错误消息。 SFINAE 不应用于参数验证,而应用于根据提供的类型选择另一个实现。

关于c++ - 模板类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868422/

相关文章:

c# 与 c++ ssl_connect

c++ - 如何保持服务器运行(cpprestsdk - 卡萨布兰卡)

c++ - 用户定义转换中的模板参数类型推导

c++ - 推断声明的类型

c++: OpenCV cv::Mat::at 无法分配给常量变量

c++ - 同一程序多次执行的未定义行为

c++ - 为什么析构函数不修改返回的变量

c++ - 为什么迭代器类型推导会失败?

c++ - 在创建 std::tuple 时从 const char* 或 char* 推导 std::string

c++ - 通过转换运算符推导模板参数类型