在literal / const模板参数中使用变量内容

时间:2014-12-04 13:10:52

标签: c++ templates

假设

template <int16_t value>
struct x;

代码中的某处,有:

int16_t var;

我想将var内容用作value

在C ++ 11或C ++ 14中是否可能?

TIA!

2 个答案:

答案 0 :(得分:1)

与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编写。

Live example

但是如果使用运行时值,你真的想使用模板吗?

答案 1 :(得分:0)

不确定

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保持的值仅在运行时已知(除非它实际上是常量,但您没有声明它)。

我会考虑重新设计。如果您需要此参数是可变的,它应该是函数的参数,而不是模板参数。否则你就结束了以上。