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

标签 c++ templates syntax

我有一个 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 参数逐个递归地转换为编译时参数。

Live example

关于c++ - 如何在没有 2^n if 语句的情况下启动具有许多 bool 参数的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28244098/

相关文章:

c++ - shared_ptr 的静态成员函数 make_shared

c++ - 功能模板显式特化

未调用 C++ 构造函数

javascript - 用 [] react setState

c++ - CRTP + enable_if 的好友功能不起作用?

c++ - 检查std::string是否包含小写字符?

C++ 3D vector 模板

c++ - 类模板的模板参数推导是否适用于非类型模板参数?

python - python 中的 ***91/***93 是什么

android - 在嵌入式上快速解决许多微小的线性规划问题