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,但我根本无法让它工作,所以经过几个小时的失败后,我正在寻求你的帮助.
谢谢 :)
如果编译器支持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)
您可以组合使用std::is_floating_point和std::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)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |