限制访问功能

Jes*_*per 3 c++ traits type-traits c++11

我有一个带有函数的泛型类,我想在编译时将其限制为浮点类型的实例.如下例所示:

template <typename T>
class ClassName
{
    // instance variables, etc..

    void some_method()
    {
        // do stuff, but only for floating point types
    }
}
Run Code Online (Sandbox Code Playgroud)

如何让编译器拒绝some_method用于非浮点类型的ClassName?

我一直在看SFINAE,但我根本无法让它工作,所以经过几个小时的失败后,我正在寻求你的帮助.

谢谢 :)

use*_*009 6

如果编译器支持c ++ 11,请使用static_assert

void some_method()
{
    static_assert( std::is_floating_point<T>::value, "Only for floating points" );
    // do stuff, but only for floating point types
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试为非浮点参数调用此方法,则会出现编译器错误.

而对于非浮点:

static_assert( !std::is_floating_point<T>::value, "and only for non-floating point" );
Run Code Online (Sandbox Code Playgroud)


jua*_*nza 6

您可以组合使用std::is_floating_pointstd::enable_if仅启用浮点类型的函数:

#include <type_traits>

template <typename T>
class ClassName
{
    // instance variables, etc..
 public:
  template<typename T2 = T,
           typename = typename std::enable_if< std::is_floating_point<T2>::value >::type>
  void some_method()
  { 
    // do stuff, but only for floating point types
  } 
};

int main()
{
  ClassName<double> d; // OK
  d.some_method();     // OK
  ClassName<int> i;    // OK
  i.some_method();     // ERROR
}
Run Code Online (Sandbox Code Playgroud)