【问题标题】:C++ avoid writing two similar functionsC++避免编写两个相似的函数
【发布时间】:2016-11-11 12:05:44
【问题描述】:

我想通过在中间隐藏或不隐藏几行代码来拥有两个版本的函数,也可以通过模板或其他方式在函数的末尾附近隐藏。该怎么做?

这些功能对性能至关重要。他们运行了无数次。

【问题讨论】:

  • −1 正如a comment 中解释的那样,示例和描述不是真正问题的示例和描述,这是另外一回事.还有,伪代码。细微的差异,例如在 A 中初始化,而不是在 B 中。
  • 函数 B 被声明为 void 但返回 int
  • 并且x 未初始化。 d 在编译时是否已知?
  • 为什么要使用模板?我只会做if (flag) { /* line of code */} 并让编译器和 cpu 完成优化和预测的工作
  • 以下是投票率最高的问题列表:data.stackexchange.com/stackoverflow/query/36660/… 其中一些实际上很有趣。

标签: c++ templates


【解决方案1】:

您可以使用默认参数实现第一个:

int A(int a, int b, int c, int d = 0)
{
    // stuff
}

【讨论】:

  • @rxu 最好用一个真实的例子再试一次?一些简短的东西,可以抓住您要解决的问题的本质。
  • 如果可以的话,将默认参数移动到编译时参数(即模板参数)。它对编译器有一点帮助。
  • 我想我会使用tobi303的想法和默认参数。喜欢int A(int a, int b, int c, int flag); 然后用if (flag){ /* things to hide */ } 隐藏多余的行。谢谢你的想法。
【解决方案2】:

您可以分解出公共部分并使用函数对象来传递不同的部分:

template<class Fun>
int AB(Fun&& fun){
    int x = 0;
    Outer Loop{
        Inner Loop{
            x = std::forward<Fun>(fun)();
        }
    }
    return x;
}

int a, b, c, d;
// ... initialize
int result1 = AB([a,b,c]{
    return a + b;
});
int result2 = AB([a,b,c,d]{
    return a + b + c*d;
});

您可以通过模板化返回类型来使其更加通用。

没有分支,优化编译器将能够内联扩展函数调用。后者是更喜欢函数对象而不是函数指针的原因。

【讨论】:

  • 也许我可以将inline 添加到int result 函数中。即使使用模板,这是否会确保函数内联?
  • @rxy 没有int result 函数。你的意思是?无法确保调用将在标准 c++ 中内联扩展。您能做的最好的事情就是保证编译器可以内联。编译器可以内联此示例中显示的所有调用。
  • 我的错。我把这个和 nosbor 的回答混在一起了。
【解决方案3】:

老实说,我建议您重新实现您的代码。但是我想到的一件事是使用函数作为参数,见下文(您也可以使用 lambda 表达式):

int fun1(int a, int b, int c, int d) {
    return a + b;
}

int fun2(int a, int b, int c, int d) {
    return a + b + c*d;
}

template <int (*FUN)(int, int, int, int)> int fun_main(int a, int b, int c, int d = 0) {
    int x = 0;
    Outer Loop{
        Inner Loop{
            x += FUN(a, b, c, d);
        }
    }
    return x;
}

然后在你的代码中某处:

fun_main<fun1>(1, 2, 3, 4);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多