整数类型的模板函数特化

新手上路,请多包涵

假设我有一个模板函数:

 template<typename T>
void f(T t)
{
    ...
}

我想为所有原始整数类型编写一个特化。做这个的最好方式是什么?

我的意思是:

 template<typename I where is_integral<I>::value is true>
void f(I i)
{
    ...
}

并且编译器为整数类型选择第二个版本,而为其他所有类型选择第一个版本?

原文由 Andrew Tomazos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 550
2 个回答

使用 SFINAE

 // For all types except integral types:
template<typename T>
typename std::enable_if<!std::is_integral<T>::value>::type f(T t)
{
    // ...
}

// For integral types only:
template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type f(T t)
{
    // ...
}

请注意,即使是声明,您也必须包含完整的 std::enable_if 返回值。

C++17 更新:

 // For all types except integral types:
template<typename T>
std::enable_if_t<!std::is_integral_v<T>> f(T t)
{
    // ...
}

// For integral types only:
template<typename T>
std::enable_if_t<std::is_integral_v<T>> f(T t)
{
    // ...
}

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 c++11,可以使用 std::enable_if ( http://en.cppreference.com/w/cpp/types/enable_if ) 来做到这一点:

 template<typename T, class = typename std::enable_if<std::is_integral<T>::value>::type>
void f(T t) {...}

原文由 arnoo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏