函数的两个变体,中间有一个简单的if语句

问题描述 投票:0回答:1

这个问题是一种设计问题。基本上我常常会得到一个执行高计算的函数,但是在它的中间有一个if语句,这对整个程序的性能有很大的影响。

考虑这个例子:

void f(bool visualization)
{
    while(...)
    {
        // Many lines of computation
        if (visualization) 
        {
            // do the visualization of the algorithm
        }
        // More lines of computation
    }    
}

这个例子中的问题是,如果bool visualization设置为false,我想程序将检查它是否为循环的每次迭代都是真的。

一个解决方案就是创建两个单独的函数,包括和不使用可视化:

void f()
{
    while(...)
    {
        // Many lines of computation
        // More lines of computation
    }    
}

void f_with_visualization()
{
    while(...)
    {
        // Many lines of computation
        // do the visualization of the algorithm
        // More lines of computation
    }    
}

所以现在我没有if检查。但它产生了另一个问题:我的代码混乱并且它违反了DRY。

我的问题是:有没有办法更好地做到这一点,而无需复制代码?或者C ++编译器优化器可能会检查我想要执行的函数版本(使用bool = true或bool = false)然后创建一个虚拟函数,而不用这个if检查本身(就像我自己创建的那样)?

c++ dry
1个回答
1
投票

您可以在bool参数上模拟函数并使用if constexpr。像这样:

template<bool visualization>
void f_impl()
{
    while(...)
    {
        // Many lines of computation
        if constexpr (visualization) 
        {
            // do the visualization of the algorithm
        }
        // More lines of computation
    }    
}

void f(bool visualization)
{
    if (visualization)
        f_impl<true>();
    else
        f_impl<false>();
}
© www.soinside.com 2019 - 2024. All rights reserved.