C ++避免编写两个类似的函数

时间:2016-07-08 20:21:11

标签: c++ templates

我希望通过使用模板或其他方法隐藏或不隐藏函数的中间和附近的几行代码来使两个版本成为函数。怎么做?

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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;
});

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

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

答案 2 :(得分:1)

老实说,我建议你重新实现你的代码。但是我想到的一件事就是使用函数作为参数,见下文(你也可以使用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);