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
正如提到的评论之一,您可以使用 array
或 vector
来替换 map
并具有一些约束:枚举具有唯一值。
std::array<void(*)(), 3> procs = {process<id_1>, process<id_2>, process<id_3>};
procs[rand() % 3]();
我的问题是如何在不使用映射的情况下通过运行时已知的 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
正如提到的评论之一,您可以使用 array
或 vector
来替换 map
并具有一些约束:枚举具有唯一值。
std::array<void(*)(), 3> procs = {process<id_1>, process<id_2>, process<id_3>};
procs[rand() % 3]();