gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:39 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com