c++ - 模板类型的成员枚举类作为函数参数
问题描述
我想创建一个模板函数作为参数,而不是模板类型本身,而是模板类型的成员枚举类。这可能吗?
下面的代码演示了我想要实现的目标,我想知道是否有一些模板魔法可以为我完成它。
#include <iostream>
using namespace std;
class A{
public:
enum class ID {a1, a2};
static void f(ID id){
switch(id){
case ID::a1:
std::cout << "a1\n";
break;
case ID::a2:
std::cout << "a2\n";
break;
}
}
};
class B{
public:
enum class ID {b1};
static void f(ID id){
switch(id){
case ID::b1:
std::cout << "b1\n";
break;
}
}
};
template<typename TypeName>
void g(TypeName::ID id){
TypeName::f(id);
}
int main(int argc, char **argv){
g(A::ID::a1);
g(A::ID::a2);
g(B::ID::b1);
return 0;
}
想要的输出是
a1
a2
b1
特别要注意我希望函数 g 如何将 TypeName::ID 作为参数而不是 TypeName。
首选 C++11 解决方案,但适用于更高版本的解决方案也值得关注。
解决方案
#include <iostream>
using namespace std;
class A{
public:
enum class ID {a1, a2};
static void f(ID id){
switch(id){
case ID::a1:
std::cout << "a1\n";
break;
case ID::a2:
std::cout << "a2\n";
break;
}
}
};
class B{
public:
enum class ID {b1};
static void f(ID id){
switch(id){
case ID::b1:
std::cout << "b1\n";
break;
}
}
};
template<typename TypeName>
void g(typename TypeName::ID id){
TypeName::f(id);
}
int main(int argc, char **argv){
g<A>(A::ID::a1);
g<A>(A::ID::a2);
g<B>(B::ID::b1);
return 0;
}