использовать переменную contet в параметре шаблона литерал / констант

0

предполагать

template <int16_t value>
struct x;

Где-то в коде есть:

int16_t var;

Я хотел бы использовать значение var качестве value.

Возможно ли это на С++ 11 или С++ 14?

ТИА!

  • 0
    Возможно только если var является постоянной времени копирования. constexpr это constexpr .
Теги:
templates

2 ответа

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 - это С++ 14, но может быть написано на С++ 11.

Живой пример

Но вы действительно хотите использовать шаблон, если используете значение времени выполнения?

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 имеет значение, известно только во время выполнения (если оно действительно не является константой, но вы не объявляли его как таковое).

Я бы рассмотрел редизайн. Если вам нужно, чтобы этот параметр был переменным, он должен быть параметром функции, а не параметром шаблона. В противном случае вы закончите с приведенным выше.

  • 0
    Обратите внимание, что массив, эквивалентный переключателю, может быть создан с использованием шаблона.
  • 0
    Jarod42, не могли бы вы опубликовать ссылку, как это сделать? Я не хочу для всего диапазона int16_t, но, скажем, для массива из 100 записей. Благодарю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню