我如何声明 SFINAE 类?

use*_*124 5 c++ templates sfinae c++11

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

template <typename T, swift::enable_if<std::is_floating_point<T>::value> = nullptr>
  class my_float;
Run Code Online (Sandbox Code Playgroud)

我没有在这个类之外定义方法。不编译,不知道为什么

max*_*x66 2

嗯...不完全是 SFINAE...但也许,使用模板专业化?如下?

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

template <typename T>
class my_float<T, true>
 {
   // ...
 };
Run Code Online (Sandbox Code Playgroud)

如果你确实想使用SFINAE,你可以写

template <typename T,
   typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
class my_float
 {
   // ...
 };
Run Code Online (Sandbox Code Playgroud)

或者也(观察示例中没有的指针)

template <typename T,
   typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr>
class my_float  // ------------------------------------------------^
 {
 };
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

正如 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>
 {
   // ...
 };
Run Code Online (Sandbox Code Playgroud)

开发有两个版本(两个不同的部分特化),第一个版本用于浮点类型,第二个版本用于整数类型。并且可以很容易地扩展。