我可以用 std::enable_if 摆脱模板专业化吗?
Can I get rid of template specialisation with std::enable_if?
我读到std::enable_if
基于类型任意属性的函数重载
所以我试图通过 enable_if
重载类 ctors(如下所示(,但我收到错误,说enable_if
不能用于禁用声明,当我使用 std::enable_if
时,两行都这样做:
#include <iostream>
#include <type_traits>
#include <typeinfo>
template <typename T>
class cls
{
public:
cls (T a, typename std::enable_if< std::is_same<T, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for intn";
}
cls (T a, typename std::enable_if< std::is_same<T, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for charn";
}
};
int main()
{
cls a(10);
cls b('x');
return 0;
}
那么是否可以使用 enbale_if
来重载 ctors .
问题是,例如,当您实例化cls<int>
时,您总是会从第二个构造函数覆盖中获得失败的要求,即 std::enable_if< std::is_same<T, char>::value >::type
与T
是int
.cls<char>
也是如此.
你可以使构造函数模板使SFINAE生效;这将从重载集中摆脱模板专用化,并且不会导致编译错误。
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for intn";
}
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for charn";
}
住
你在这里似乎不需要enable_if
,只需要一个常规的构造函数:
cls(T a) { std::cout << "Ctor for Tn"; }
要禁用模板类专用化,请不要提供其定义:
template<> class cls<void>; // disabled specialization.
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 类模板的成员功能的定义在单独的TU中完全专业化
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词