假设
template <int16_t value>
struct x;
在代码中的某个地方,有:
int16_t var;
我想使用var
内容作为value
。
C++11或C++14中,是否可能?
啪!
与DarkFalcon的答案类似,你可以建立一个跳跃表。
假设如下:
template <std::int16_t value>
struct x
{
static void f() { std::cout << value << std::endl; };
};
您可以为每个值构建一个array
,如下所示:
template <std::int16_t lowest, std::size_t ... Is>
constexpr std::array<void (*)(), sizeof...(Is)>
make_x_functions(std::index_sequence<Is...>)
{
return {&x<std::int16_t(lowest + Is)>::f...};
}
void call_x(std::int16_t i)
{
constexpr std::int16_t lowest = -42;
constexpr std::int16_t size = 100;
constexpr auto arr = make_x_functions<lowest>(std::make_index_sequence<size>());
if (lowest <= i && i < lowest + size)
{
arr[i - lowest]();
}
}
请注意,std::index_sequence
是 C++14,但可以用 C++11 编写。
现场示例
但是,如果您使用运行时值,您真的要使用模板吗?
当然:
switch(var)
{
case -32768: x<-32768>::do_something(); break;
case -32767: x<-32767>::do_something(); break;
case -32766: x<-32766>::do_something(); break;
case -32765: x<-32765>::do_something(); break;
/* ... */
case 32765: x<32765>::do_something(); break;
case 32766: x<32766>::do_something(); break;
case 32767: x<32767>::do_something(); break;
}
模板是编译时。实例化模板需要生成代码,这只能在编译时完成。var
持有什么值只有在运行时才知道(除非它真的是一个常量,但你没有这样声明它)。
我会考虑重新设计。如果需要此参数是变量,则它应该是函数的参数,而不是模板参数。否则,您最终会得到上述情况。