Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在literal/const模板参数中使用变量contet_C++_Templates - Fatal编程技术网

C++ 在literal/const模板参数中使用变量contet

C++ 在literal/const模板参数中使用变量contet,c++,templates,C++,Templates,假设 我想使用var内容作为value 在C++11或C++14中,这是否有可能 蒂亚 当然可以: int16_t var; 开关(var) { case-32768:x::do_something();break; case-32767:x::do_something();break; case-32766:x::do_something();break; case-32765:x::do_something();break; /* ... */ 案例32765:x::do_somethin

假设

我想使用
var
内容作为
value

在C++11或C++14中,这是否有可能

蒂亚

当然可以:

int16_t var;
开关(var)
{
case-32768:x::do_something();break;
case-32767:x::do_something();break;
case-32766:x::do_something();break;
case-32765:x::do_something();break;
/* ... */
案例32765:x::do_something();break;
案例32766:x::do_something();break;
案例32767:x::do_something();break;
}
模板是在编译时生成的。实例化模板需要生成代码,这只能在编译时完成。只有在运行时才知道值
var
是什么(除非它确实是一个常量,但您没有这样声明它)


我会考虑重新设计。如果需要将此参数设置为变量,则它应该是函数的参数,而不是模板参数。否则,您将得到上述结果。

与DarkFalcon的答案类似,您可以构建一个跳转表

假设如下:

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;
}
template <std::int16_t value>
struct x
{
    static void f() { std::cout << value << std::endl; };
};
请注意,
std::index_sequence
是C++14,但可以用C++11编写


但是,如果使用运行时值,是否确实要使用模板?

请注意,可能会使用模板生成与开关等效的数组。Jarod42,请发布一个有关如何操作的链接,好吗?我不想要int16_t的整个范围,但是,比如说,一个包含100个条目的数组。谢谢。@canellas:添加了一个答案。只有当
var
是复制时间常数时才可能。声明它
constexpr
template <std::int16_t value>
struct x
{
    static void f() { std::cout << value << std::endl; };
};
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]();
    }
}