我有一个 CUDA (C++) 代码专门出于性能原因使用函数模板,这样该函数将只做它需要做的事情,而不是不断地加载和读取 bool 值来检查它是否需要做某事.
所有模板参数都是 bool 值。在启动内核时,CPU 检查 bool 值并启动适当的,我相信它被称为内核模板的“实例化”。我知道这会导致代码大小呈指数增长,但我的问题是关于其他事情:启动内核模板涉及 2^n if 语句,是否有更智能的语法?
例如,如果 n=2:
if(bool1){
if(bool2){
<true,true>func();
}
else{
<true,false>func();
}
}
else{
if(bool2){
<false,true>func();
}
else{
<false,false>func();
}
}
当 n=10 时,它变得 Not Acceptable ,是否有语法可以避免这种恐怖情况?
例如我试过
<bool1 ? true:false,bool2 ? true:false>func()
但是编译器不喜欢它...
Change boolean flags into template arguments似乎在谈论类似的问题,但 OP 不仅仅是 bool 值,而且提供的解决方案对我来说看起来比问题更糟糕,坦率地说,我一个字也听不懂。
最佳答案
您可以像这样向 func
添加重载:
template< bool... Bs >
void func()
{
// Implement func with compile-time Bs...
}
template< bool... Bs, typename... Ts >
void func( bool b, Ts... ts )
{
if( b ) {
func< Bs..., true >( ts... );
}
else {
func< Bs..., false >( ts... );
}
}
int main()
{
// call func< true, false, true, true >();
func( true, false, true, true );
}
它的工作原理是将运行时 bool 参数逐个递归地转换为编译时参数。
关于c++ - 如何在没有 2^n if 语句的情况下启动具有许多 bool 参数的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28244098/