【发布时间】:2019-12-12 20:45:27
【问题描述】:
我想创建一个模板函数作为参数,而不是模板类型本身,而是模板类型的成员枚举类。这可能吗?
以下代码演示了我想要实现的目标,我想知道是否有一些模板魔术可以为我完成它。
#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 解决方案,但适用于更高版本的解决方案也值得关注。
【问题讨论】:
-
'g' 中的 TypeName 模板参数在不可演绎的上下文中,因此调用者必须明确地专门化 'g'。但请注意,您可以将 ID 类型本身作为模板参数 - 为什么它是内部类型很重要?
-
@IgorR。在我上面给出的例子中,g 需要在 TypeName 上调用一个静态函数。在我使用它的真实示例中,我对应的 g 需要调用另一个模板函数,其中 TypeName 作为模板参数传递。