Сопоставить int с Template int - PullRequest
       4

Сопоставить int с Template int

2 голосов
/ 17 октября 2019

Есть ли более элегантное решение (к, очевидно, очевидной проблеме), чем

switch(variableInt)
{
    case 0: tmpl<0>::foo(); break;
    case 1: tmpl<1>::foo(); break;
    // up to, say, 10
}

Очевидно, что это может быть определено только в некотором диапазоне. Я нашел только старые темы по этому поводу, может быть, какая-то приятная функция C ++ 17 или C ++ 20, которая помогает нам здесь?

1 Ответ

1 голос
/ 17 октября 2019

Как насчет этого?

#include <utility>

template <std::size_t I>
int foo(int arg) {
    return I * arg;
}

template<std::size_t ...Is>
auto get_foo(std::index_sequence<Is...>, int i) {
    return *(std::initializer_list<int(*)(int)>{&foo<Is>...}.begin() + i);
}

int foo(std::size_t i, int arg) {
    return get_foo(std::make_index_sequence<11>(), i)(arg);
}

Вот еще одно решение, которое оптимизирует более приятно:

#include <utility>

template <std::size_t I>
int foo(int arg) {
    return I * arg;
}

template<std::size_t ...Is>
auto foo(std::index_sequence<Is...>, int i, int arg) {
    int ret;
    ((Is == i && (ret = foo<Is>(arg))), ...);
    return ret;
}

int foo(std::size_t i, int arg) {
    return foo(std::make_index_sequence<11>(), i, arg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...