簡體   English   中英

在文字/常量模板參數中使用變量contet

[英]use variable contet in a literal/const template parameter

假設

template <int16_t value>
struct x;

在代碼中的某處有:

int16_t var;

我想將var內容用作value

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

TIA!

與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持有的值只有在運行時才知道(除非它確實是一個常數,但您並未這樣聲明)。

我會考慮重新設計。 如果需要此參數為變量,則它應該是函數的參數,而不是模板參數。 否則,您將獲得上述收益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM