更改重载操作员的签名

Changing an overloaded operator's signature

本文关键字:操作员 重载      更新时间:2023-10-16

运算符只能为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;
}

您将能够提供所需的行为。这只是一个例子:)