这是一个解决方案。向下滚动以查看我的思考过程。
#include <type_traits>
#include <iostream>
struct ParameterTypeA {};
struct ParameterTypeB {};
enum class MyCases {
CASE1,
CASE2
};
template<enum MyCases U>
class MyClass
{
public:
MyClass() { }
~MyClass() { }
template<enum MyCases T = U>
void myFunction(ParameterTypeA a, typename std::enable_if<T == MyCases::CASE1, void>::type* = nullptr) {
std::cout << "A" << std::endl;
}
template<enum MyCases T = U>
void myFunction(ParameterTypeB b, typename std::enable_if<T == MyCases::CASE2, void>::type* = nullptr) {
std::cout << "B" << std::endl;
}
};
int main() {
MyClass<MyCases::CASE1> m1;
m1.myFunction(ParameterTypeA{});
MyClass<MyCases::CASE2> m2;
m2.myFunction(ParameterTypeB{});
return 0;
}
输出:
A
B
现场示例
没有template
在成员函数之前添加,你会得到一个error: no type named 'type' in 'struct std::enable_if<false, void>'
错误或类似的东西。为了理智,我把它归结为这个例子:
#include <type_traits>
template <typename U>
class Test {
template <typename T = U>
void myFunction(int b, typename std::enable_if<std::is_same<int, T>::value, void>::type* = nullptr) {
}
template <typename T = U>
void myFunction(int b, typename std::enable_if<!std::is_same<int, T>::value, void>::type* = nullptr) {
}
};
int main() {
Test<int> test;
return 0;
}
意识到这一点后,我修改了第一人的答案以得到这个。如您所见,enum class
此版本中没有,但是如果您将typename U
and更改typename T
为enum MyCases
,它就像魔术一样工作。
#include <type_traits>
#include <iostream>
struct ParameterTypeA {};
struct ParameterTypeB {};
template<typename U>
class MyClass
{
public:
MyClass() { }
~MyClass() { }
template<typename T = U>
void myFunction(ParameterTypeA a, typename std::enable_if<std::is_same<ParameterTypeA, T>::value, void>::type* = nullptr) {
std::cout << "A" << std::endl;
}
template<typename T = U>
void myFunction(ParameterTypeB b, typename std::enable_if<std::is_same<ParameterTypeB, T>::value, void>::type* = nullptr) {
std::cout << "B" << std::endl;
}
};
int main() {
MyClass<ParameterTypeA> m1;
m1.myFunction(ParameterTypeA{});
MyClass<ParameterTypeB> m2;
m2.myFunction(ParameterTypeB{});
return 0;
}
输出:
A
B
现场示例