我正在尝试使用
std::enable_if
根据传递给它的枚举值有选择地启用类上的函数。这是我目前正在尝试的方法:
// class def
template<MyEnum E>
class ClassA {
// function
template <MyEnum EN = E, typename = std::enable_if_t<EN != MyEnum::some_value>>
void customFunction(double v);
当我在没有实际创建函数定义的情况下对其进行测试时,它工作正常并且自定义函数仅在枚举正确时才有效。问题是我似乎无法在我的 cpp 文件中定义它,就像做这样的事情:
template <MyEnum E, typename = std::enable_if_t<E != MyEnum::some_value>>
void ClassA<EN>::customFunction(double v) {}
给我错误
"Too many template parameters in template redeclaration"
。我知道我可以在我的头文件中定义它,但我觉得有更好的方法来做到这一点。
感谢您的帮助!
在类外定义成员模板时需要添加单独的模板参数子句。另请注意,在定义成员模板时无需指定默认参数。
因此,修正后的程序应该是这样的:
enum MyEnum{some_value};
template<MyEnum E>
class ClassA {
template <MyEnum EN = E, typename = std::enable_if_t<EN != MyEnum::some_value>>
void customFunction(double v);
};
//this is the correct syntax to define the member template outside the class template
template <MyEnum E>
template<MyEnum EN, typename> //added this parameter clause
void ClassA<E>::customFunction(double v) {}