我有一个模板函数(在我的例子中是一个 cuda 内核),其中有少量布尔模板参数可以在运行时选择。我很高兴在编译时实例化所有排列并动态调度,就像这样(对于布尔值 b0、b1、b2):
if (b0) {
if (b1) {
if (b2) {
myFunc<true,true,true,otherArgs>(args);
} else {
myFunc<true,true,false,otherArgs>(args);
}
} else {
if(b2) {
myFunc<true,false,true,otherArgs>(args);
} else {
myFunc<true,false,false,otherArgs>(args);
}
}
} else {
if(b1) {
if(b2) {
myFunc<false,true,true,otherArgs>(args);
} else {
myFunc<false,true,false,otherArgs>(args);
}
} else {
if(b2) {
myFunc<false,false,true,otherArgs>(args);
} else {
myFunc<false,false,false,otherArgs>(args);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这写起来很烦人,如果我最终得到 b3 和 b4,情况会变得更糟。
有没有一种简单的方法可以在 C++11/14 中以更简洁的方式重写它而不引入大型外部库(如 boost)?就像是:
const auto dispatcher = construct_dispatcher<bool, 3>(myFunc);
Run Code Online (Sandbox Code Playgroud)
...
dispatcher(b0,b1,b2,otherArgs,args);
Run Code Online (Sandbox Code Playgroud)