更改重载操作员的签名
Changing an overloaded operator's signature
运算符只能为C++语法中为其定义的语法声明。例如,不能定义一元 % 或三元 +。
考虑类 A 的输出运算符。作为非成员,它具有以下签名:
ostream& operator<<(ostream&, A&);
无法更改此签名。 运算符<<是一个二元运算符。即,它只能接受 2 个参数。
相应的>>运算符也是如此。
在某些情况下,这可能会受到限制,因为它不会为此运算符的用户提供所需的灵活性。
例如,考虑用于存储货币金额的类 Money 及其输出运算符:
ostream& operator<<(ostream&, Money&);
由于涉及货币值,我们还需要显示货币符号,它可以是本地或国际符号。如果用户应该能够指定这一点,我们需要上面的运算符有另一个参数,比如 bool intl。 然后,操作员的签名将是:
ostream& operator<<(ostream&, bool intl, Money&);
当然,这是不可能的,因为签名是固定的。
在这种情况下,我们怎么能继续前进?
谢谢。
如何制作某种可用于重载运算符的标签结构?比如
ostream& operator<<(ostream&, LocalMonetaryType);
然后你可以做例如
std::cout << LocalMonetaryTypeInstance << YourMoneyObject;
可以进行优化,以便您使用Money
成员函数来获取标记对象,然后它包含要写入的预期符号。
如果一个钱是一个类,它应该有一个布尔国际作为成员字段。因此,在这种情况下,运算符仍将具有正确的定义。为此定义枚举会更好,示例代码:
class Money
{
public:
MonetaryEnum localCurrency;
double amount;
friend ostream& operator<< (ostream& os, const Money& m);
}
ostream& operator<<(ostream& os, const Money& m)
{
os << enumToString(localCurrency) << m.getAmount() << std::endl;
return os;
}
您将能够提供所需的行为。这只是一个例子:)
相关文章:
- 继承函数的重载解析
- 友谊和操作员+=重载
- C++重载>>和<<操作员
- 运算符重载中没有操作员'=='匹配项
- 更改重载操作员的签名
- C []索引操作员重载作为登录器和突变器
- 使用多个操作员与操作员重载会产生奇怪的错误
- 操作员重载=修改原始对象
- 为什么最后一个SR5对象不用重载的新操作员占据内存
- 如何使用此独特的操作员重载功能
- 操作员重载内部调用转换
- 重载<<操作员打印矢量内容
- 在C++重载cout ostream操作员
- 为什么以及如何重载操作员<<进行打印
- 插入运算符重载有什么问题?(<<操作员)
- 操作员在不同命名空间中的不明确重载
- c++重载的操作员工作
- "&"在操作员重载中意味着什么
- 对具有重载操作员>的类型进行就地销毁
- C++操作员重载两次