C++, select 模板参数函数

C++, select function by template parameter

我的问题是如何在不使用映射的情况下通过运行时已知的 id 调用 process 函数之一?

#include <iostream>
#include <map>

enum id
{
    id_1,
    id_2,
    id_3
};

template <id id_>
void process();

template<>
void process<id_1>()
{
    std::cout << "1" << std::endl;
}

template<>
void process<id_2>()
{
    std::cout << "2" << std::endl;
}

template<>
void process<id_3>()
{
    std::cout << "3" << std::endl;
}

std::map<id, void(*)()> mapping =
{
    {id_1, process<id_1>},
    {id_2, process<id_2>},
    {id_3, process<id_3>}
};

int main()
{

    for (int i = 0; i < 10; ++i)
    {
        mapping[static_cast<id>(rand()%3)]();
    }

    return 0;
}

map 是一个优雅的解决方案。

如果你不想使用map,你必须'map'函数调用你自己。

switch-case

void mapped_process(id id_) {
    switch (id_) {
    case id_1:
        process<id_1>();
        break;
    case id_2:
        process<id_2>();
        break;
    case id_3:
        process<id_3>();
        break;
    default:
        break;
    }
}

mapped_process(static_cast<id>(rand()%3);

map by index

正如提到的评论之一,您可以使用 arrayvector 来替换 map 并具有一些约束:枚举具有唯一值。

std::array<void(*)(), 3> procs = {process<id_1>, process<id_2>, process<id_3>};

procs[rand() % 3]();