能否无需重载运算符直接访问单成员包装类实现算术运算?
实现自定义Decimal类的便捷算术运算
可行,有两种简洁方案可以避免手动重载所有算术运算符:
方案一:利用隐式类型转换
给自定义Decimal类添加隐式构造函数和转换运算符,让编译器自动在自定义类和底层decimal::Decimal之间转换,直接复用底层类型的算术逻辑:
class Decimal { public: // 支持从底层decimal类型或整数隐式构造自定义Decimal Decimal(const decimal::Decimal& val) : _value(val) {} Decimal(int val) : _value(val) {} // 支持将自定义Decimal隐式转换为底层decimal类型 operator decimal::Decimal() const { return _value; } decimal::Decimal _value; };
这样你就能直接写Decimal c = a + b:编译器会自动把a和b转成decimal::Decimal执行加法,再把结果隐式转成自定义Decimal赋值给c,完全符合你的需求。
注意:隐式转换虽然方便,但可能带来意外的类型匹配(比如自定义Decimal会自动传给接受decimal::Decimal的函数)。如果需要严格控制类型转换,可以把构造函数改成explicit,此时只需显式转换结果:Decimal c = Decimal(static_cast<decimal::Decimal>(a) + static_cast<decimal::Decimal>(b));,仍比重载所有运算符省事。
方案二:批量生成运算符
如果不想用隐式转换,也可以用宏批量定义算术运算符,避免重复代码:
class Decimal { public: Decimal(const decimal::Decimal& val) : _value(val) {} Decimal(int val) : _value(val) {} decimal::Decimal _value; }; // 用宏批量定义算术运算符 #define DEFINE_ARITH_OP(op) \ Decimal operator op(const Decimal& lhs, const Decimal& rhs) \ { \ return Decimal(lhs._value op rhs._value); \ } DEFINE_ARITH_OP(+) DEFINE_ARITH_OP(-) DEFINE_ARITH_OP(*) DEFINE_ARITH_OP(/) #undef DEFINE_ARITH_OP
这种方式没有隐式转换的风险,同时只需少量代码就能支持所有基础算术运算。后续如果需要扩展+=、-=这类复合运算符,也可以用类似的宏批量定义。
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

