对于一个模板函数,它接受一个整数,我写了下面的通用调度员:带有typename的模板的递归实例化?
#define Dispatch_Template(funct_name, max) \
template<int i> decltype(&funct_name<0>) Dispatch_template_##funct_name (int index) { \
return (index == i) ? funct_name <i> : Dispatch_template_##funct_name <i - 1>(index); \
} \
template<> decltype(&funct_name<0>) Dispatch_template_##funct_name <-1>(int) { \
return nullptr; \
} \
decltype(&funct_name<0>) Dispatch_##funct_name (int i) { \
return Dispatch_template_##funct_name <max>(i); \
} \
这工作,我可以做这样的事情:
template<int some_int> void PrintInt() {
printf("int is %i\n", some_int);
}
Dispatch_Template(PrintInt, 6);
int main()
{
for (int i = 0; i < 6; ++i) {
Dispatch_PrintInt(i)();
}
return 0;
}
但是如果我想传递一个typename参数给我的模板函数?
例如,假设它看起来像这样:
template<int some_int, typename some_type> void PrintSomeType(some_type arg) {
// do something
}
我希望能够做到这一点:
template<typename some_type> void caller(some_type arg) {
Dispatch_Template(PrintSomeType, some_type, 6);
for (int i = 0; i < 6; ++i) {
Dispatch_PrintSomeType(i)(arg);
}
}
我不知道如何做到这一点 - 我运行成为“模板声明不允许在这里”的问题。 (请注意,此处的Dispatch_Template必须位于函数内部,因为函数本身是模板化的。)
C++模板不能在函数体中声明。这就是扩展Dispatch_Template宏所做的事情。我觉得你正在寻找一个非常复杂的解决方案来解决一个简单的问题。如果您描述了您在宏伟计划中想实现的目标,我可以提出一个更简单的解决方案。一般情况下,宏比大多数时候都要麻烦。 – Ghostrider
@Ghostrider我要寻找更好的方法来做到这一点: '模板无效本功能(T VAR){...}' 然后 '如果(我== 0)本功能<0>(VAR);'' 否则如果(I == 1)本功能<1>(VAR);' '...' '否则如果(I == 100)本功能<100>(VAR): ' 我不能从函数本身中删除模板,但我不想明确地输出每个可能的情况。 –
似乎约瑟夫的答案会给你你需要的东西。 – Ghostrider