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)
我没有在这个类之外定义方法。不编译,不知道为什么
嗯...不完全是 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)
开发有两个版本(两个不同的部分特化),第一个版本用于浮点类型,第二个版本用于整数类型。并且可以很容易地扩展。
| 归档时间: |
|
| 查看次数: |
927 次 |
| 最近记录: |