【发布时间】:2021-05-05 16:23:52
【问题描述】:
我有一些功能
template<int N>
auto foo();
我想用编译时未知的模板参数调用这个函数,但它们只能是数字 1 到 c(其中 c 是一个固定常数,例如 10)。有没有比以下更好的通用解决方案?
auto foo(int n)
{
switch(n) {
case 1:
return foo<1>();
case 2:
return foo<2>();
...
case 10:
return foo<10>();
}
}
如果将函数用于更大的整数集,则此解决方案会变得非常冗长。
此模板参数是必需的,因为该函数使用具有此类模板参数的类,其中 this 用于静态大小数组的大小。但这不应该与问题真正相关。我无法更改模板版本。
【问题讨论】:
-
不确定如何在声明为
void的函数中返回任何内容。这只是一个调度员吗?如果是这样,您要解决的问题是什么? -
模板参数必须在编译时就知道,你真的无能为力。显而易见的问题是,您真的需要
N作为模板参数吗? -
你至少可以使用像
#define CASE(num) case num : return foo<num>()这样的宏,然后你就有switch(n) CASE(1); CASE(2); ...; CASE(N); -
你的意思是constraints?
-
@tadman 我猜这是口味问题。在表达“现在我们完全委托给其他函数”时,我喜欢与返回值函数的一致性。
标签: c++ templates template-meta-programming