组合或替换多个相似的重载

Combining or substituting multiple similar overloads

本文关键字:相似 重载 替换 组合      更新时间:2023-10-16

我有一个结构"foo",它有许多成员,其中一个(双栏)在基本操作中被访问了几次。所以我们不写,例如:

double a=foo.bar+3;
double b=foo.bar*5;
bool c=foo.bar==2;

我想写:

double a=foo+3;
double b=foo*5;
bool c=foo==2;
一种方法是在自由函数中重载所有所需的操作符:
template< class T>
double operator@(foo a,T b){
    return a.bar@b;
}
template< class T>
double operator@(T b,foo a){
    return a.bar@b;
}
然后我必须复制并粘贴这个代码片段,并用+、*、==和我想要的其他操作替换@。

是否有更好(更易读、更少重复、更短和/或更安全)的方法来做到这一点?例如,使用模板或引导编译器尝试用"foo"替换"foo"。

因为您只是想要返回double(而不是foo),您可以定义一个转换操作符到double:

struct foo {
    double bar;
    operator double() const { return this->bar; }
};