组合或替换多个相似的重载
Combining or substituting multiple similar overloads
我的结构 "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;
}
然后我将不得不复制并粘贴此代码段并将 @ 替换为 +、*、== 和我想要的其他操作。
是否有更好的(可读性更强、重复性更少、更短 and/or 更安全)的方法?例如,使用模板或引导编译器在找不到涉及 "foo".
的函数时尝试用 "foo.bar" 替换 "foo"
因为您只是想取回 double
(而不是 foo
是什么),您可以定义一个转换运算符到 double
:
struct foo {
double bar;
operator double() const { return this->bar; }
};
我的结构 "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;
}
然后我将不得不复制并粘贴此代码段并将 @ 替换为 +、*、== 和我想要的其他操作。
是否有更好的(可读性更强、重复性更少、更短 and/or 更安全)的方法?例如,使用模板或引导编译器在找不到涉及 "foo".
的函数时尝试用 "foo.bar" 替换 "foo"因为您只是想取回 double
(而不是 foo
是什么),您可以定义一个转换运算符到 double
:
struct foo {
double bar;
operator double() const { return this->bar; }
};