c++ 代数算子模板化

k4ymrczo  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(177)

我想写4个大的C方法,它们只与简单的运算符(+,-,*,/)不同,这些运算符出现在定义中的某些特定位置。
我不想写4个方法,我想用一个代码块来说明这些方法的逻辑基本相同,只是运算符不同。这样也更容易修复或改进逻辑。
我还想通过像模板函数一样编译方法来使方法运行得更快(因为它们被大量使用)。所以,我不满意将表示操作符的lambda函数参数添加到单个方法(或在选择操作符时测试类别参数)的想法。
有没有什么方法可以实现我想要的一个有模板参数的方法?也许,有可能在某种程度上将操作符转换为不同的类型以匹配模板逻辑?
我用的是C
14。

voase2hg

voase2hg1#

Lambdas和函数模板是最惯用的解决方案:

template <typename F>
int foo(F op, int x, int y) {
    return op(x, y);
}

int main() {
    auto plus = [](int x, int y) { return x + y; };
    return foo(plus, 1, 2);
}

字符串
这编译为(https://godbolt.org/z/oa5b8xj55):

main:
        mov     eax, 3
        ret


在这种情况下,lambda不会降低代码的速度,因为每个lambda都有不同的类型,op(...)可以很容易地内联。
具体来说,在foo的特殊化中,比如foo<__lambda>(__lambda, int, int)op(...)转换为调用__lambda::operator()(int, int) const。由于调用操作符的定义是可见的,并且lambda没有捕获,所以优化很容易。
<algorithm>头文件中的许多函数都具有相同的设计。

相关问题