使用模板当然可以做到这一点,因为模板可以有整数而不是类型参数。例如下面的函数
template <int iParam1, int iParam2>
int sum()
{
return iParam1 + iParam2;
}
是一个函数,其中iParam1
和iParam2
是特定模板实例化的固定值。例如,函数 sum<1, 2> 是一个始终返回的函数3
。
在你的情况下,Func
用这个原型定义:
template <long Param1, long Param2, long Param3, long Param4, long Param5>
void Func()
然后,创建一个std::map
将参数组合映射到固定这些参数的函数的函数。像这样的东西:
using ParamCombination = std::tuple<long, long, long, long, long>;
using ParamsToFunction = std::pair < ParamCombination, std::function<void()> >;
std::map< ParamCombination, std::function<void()> > map =
{
ParamsToFunction(std::make_tuple<long, long, long, long, long>(1, 2, 2, 2, 2), Func<1, 2, 2, 2, 2>),
...
// This map will contain pairs of all possible parameter combinations
// and their corresponding functions. This is a long list but it can be
// easily generated using a script.
};
这些函数将具有编译时优化的所有好处。最后,在运行时,您需要做的就是创建一个表示参数组合的元组并调用此元组映射到的函数:
auto comb = ParamCombination(1, 2, 2, 2, 2);
map[comb](); // function call