更改重载运算符的签名

时间:2018-01-16 11:12:41

标签: c++

只能为C ++语法中为其定义的语法声明运算符。例如,无法定义一元%或三元+。

考虑类A的输出运算符。它具有以下签名作为非成员:

ostream& operator<<(ostream&, A&);

此签名无法更改。运营商LT;&LT;是一个二元运算符。即,它只需要2个参数。

相应的&gt;&gt;的情况也是如此。操作

在某些情况下,这可能是限制性的,因为它没有为该运营商的用户提供所需的灵活性。

例如,考虑用于存储货币金额的类Money及其输出运算符:

ostream& operator<<(ostream&, Money&);

由于涉及货币价值,我们还需要显示货币符号,可以是本地符号或国际符号。如果用户应该能够指定这个,我们需要上面的运算符有另一个参数,比如bool intl。 然后,运营商的签名将是:

ostream& operator<<(ostream&, bool intl, Money&);

当然,这是不可能的,因为签名是固定的。

我们如何处理这种情况?

感谢。

2 个答案:

答案 0 :(得分:1)

如何制作某种可用于重载运算符的标记结构?比如说。

ostream& operator<<(ostream&, LocalMonetaryType);

然后你就可以做到。

std::cout << LocalMonetaryTypeInstance << YourMoneyObject;

可以进行细化,以便使用Money成员函数来获取标记对象,然后它包含要写入的预期符号。

答案 1 :(得分:0)

如果Money是一个类,它应该有一个bool intl作为成员字段。因此,在这种情况下,运算符仍将具有正确的定义为此定义枚举更好,示例代码:

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;
}

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