C++根据>>的哪一侧进行不同交互的>>操作员过载



我想知道是否有可能使C++过载>gt;操作员以这种方式

Account& operator>> (double left, Account &right)
{
right.deposit(left);
return right;
}
Account& operator>> (Account &left, double right)
{
left.withdraw(right);
return left;
}

我想知道>gt;操作员具有此功能所以我可以做一些类似的事情

account1 >> 200 >> account2

这将从第一个账户中提取200,然后将其存入第二个账户。

如前所述,这将不起作用,原因很简单:

account1 >> 200 ...

当对此进行评估时,将调用以下重载:

Account& operator>> (Account &left, double right)

您会注意到这个重载返回一个Account &。这是白纸黑字的声明。让我们继续前进:

... >> account2

现在,这个operator>>的左侧现在是Account &,过载返回的内容。它不再是double。它需要是一个double,以便另一个过载来弥补不足,并将其带回家。这就是重载运算符在C++中的工作方式。

最简单的解决方案可能是简单地从第一个过载返回一个双值:

double operator>> (Account &left, double right)
{
left.withdraw(right);
return right;
}

现在,这个表达式的结果是一个double值,这将更容易让其他过载的operator>>出现在画面中。

如前所述,在这两种情况下,您的operator>>()都返回Account&,即您无法按指示链接运算符。不过,您可以单独使用它们。然而,这似乎不是有意的。

可以通过从operator>> (Account& account, double amount)返回类似Withdraw(account, amount)实体的东西来实现您的有效目标,并使第二个操作符为operator>> (Withdraw const& withdraw, Account&)。然后,第二个操作员将触发该交易。技术上可行,但我不相信这是可行的。

#include <utility>
struct Account {
double withdraw(double amount) { return amount; }
double deposit(double amount) { return amount; }
};
struct Withdraw {
Account& account;
double   amount;
double do_it() && { return account.withdraw(amount); }
};
void operator>> (Withdraw && left, Account &right)
{
right.deposit(std::move(left).do_it());
}
Withdraw operator>> (Account &left, double right)
{
return Withdraw{left, right};
}
int main() {
Account a1, a2;
a1 >> 200 >> a2;
}

我不太确定这种方法是否可取。我想我会被代码弄糊涂,最好使用命名的操作。然而,构建一个最终作为事务执行的操作对象,结合多个单独的操作,仍然是合理的。

相关内容

  • 没有找到相关文章

最新更新