首页 > 解决方案 > 将 int 映射到 Template int

问题描述

有没有比这个更优雅的解决方案(对于一个希望显而易见的问题)

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

显然,这只能在某个范围内定义。我只找到了关于这个的老话题,也许是一些很好的 C++17 或 C++20 特性可以帮助我们?

标签: c++templates

解决方案


这样的事情呢?

#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);
}

推荐阅读