對於一個模板函數,它接受一個整數,我寫了下面的通用調度員:帶有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