代数运算符模板化

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

我想编写 4 个大型 C++ 方法,它们仅与出现在定义中某些确定位置的简单运算符(+、-、*、/)不同。

我不想编写 4 个方法,而是希望用一个代码块来说明这些方法具有基本相同的逻辑,只是运算符不同。修复或改进逻辑也会更容易。

我还希望通过像模板函数一样进行明确编译来使这些方法运行得更快(因为它们被密集使用)。因此,我对将表示运算符的 lambda 函数参数添加到单个方法(或每当选择运算符时测试的类别参数)的想法并不满意。

有没有办法通过具有模板参数的方法来实现我想要的?也许,可以将运算符转换为不同的类型以匹配模板逻辑?

供您参考,我使用 C++14。

c++ templates c++14
1个回答
1
投票

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

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

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

这会编译为(https://godbolt.org/z/hhhqqE6Tb):

main:
        mov     eax, 3
        ret
在这种情况下,Lambda 不会减慢您的代码速度,因为每个 lambda 都有不同的类型,并且

op(...)

 可以轻松内联。
<algorithm>
标题中的很多功能都有相同的设计。

© www.soinside.com 2019 - 2024. All rights reserved.