如何在没有2 ^ n if语句的情况下启动具有许多布尔参数的函数模板

Aga*_*ade 2 c++ syntax templates

我有一个使用函数模板专为性能的原因,所以该功能将只做什么它需要做的,而不是不断地加载并读取布尔检查羯羊它需要做的东西或者不是CUDA(C++)代码.

所有模板参数都是布尔值.在启动内核时,CPU检查布尔值并启动相应的,我相信它被称为"实例化"内核模板.我理解这会给出指数代码大小的增长,但我的问题是关于其他的东西:启动内核模板涉及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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当n = 10时,它变得不可接受,是否有语法来避免这种恐怖?

例如我试过, <bool1 ? true:false,bool2 ? true:false>func()但编译器不喜欢它...

将布尔标志更改为模板参数似乎谈论类似的问题,但OP不仅仅是布尔值,并且提供的解决方案看起来比问题更糟糕,坦率地说,我不明白它的一个词.

Dan*_*rey 9

你可以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 );
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理是将运行时布尔参数逐个转换为编译时参数.

实例