有些东西对我来说不太好用。这是声明一个只接受浮点模板参数的类的方法吗?
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/