c++ - 如何申报 SFINAE 类(class)?

标签 c++ c++11 templates sfinae

有些东西对我来说不太好用。这是声明一个只接受浮点模板参数的类的方法吗?

template <typename T, swift::enable_if<std::is_floating_point<T>::value> = nullptr>
  class my_float;

我无法在此类之外定义方法。不编译,不知道为什么

最佳答案

嗯……不完全是 SFINAE……但也许,使用模板特化?如下所示?

template <typename T, bool = std::is_floating_point<T>::value>
class my_float;

template <typename T>
class my_float<T, true>
 {
   // ...
 };

如果你真的想用SFINAE,你可以这样写

template <typename T,
   typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
class my_float
 {
   // ...
 };

或者(观察你的例子中没有的指针)

template <typename T,
   typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
class my_float  // ------------------------------------------------^
 {
 };

-- 编辑 --

正如 Yakk 所建议的(谢谢!),您可以混合使用 SFINAE 和模板特化来为不同的类型组开发不同版本的类。

例如,下面的my_class

template <typename T, typename = void>
class my_class;

template <typename T>
class my_class<T,
   typename std::enable_if<std::is_floating_point<T>::value>::type>
 {
   // ...
 };

template <typename T>
class my_class<T,
   typename std::enable_if<std::is_integral<T>::value>::type>
 {
   // ...
 };

有两个版本(两个不同的偏特化),第一个用于浮点类型,第二个用于整数类型。并且可以轻松扩展。

关于c++ - 如何申报 SFINAE 类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045559/

相关文章:

c++ - 检查是否使用 MATLAB mex 编译

C++:头文件中全局函数的多重定义错误

c++ - 在 C++17 中使用转发引用时,模板结构是否需要 std::decay?

c++ - C++ 是否支持 UTF-8、UTF-16 和 UTF-32 以外的字符编码之间的转换?

c++ - 在 C++ 中为友元函数定义默认参数的正确方法

templates - 相当于微格式的 DTD?

c++ - 由工厂构建的可以消失的对象的共享指针

C++ : How to count the number of threads used to call a function?

c++ - 没有对 <anonymous enum> 的匹配函数调用

c++ - 派生类中的模板有问题