我想知道是否有可能使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;
}
我不太确定这种方法是否可取。我想我会被代码弄糊涂,最好使用命名的操作。然而,构建一个最终作为事务执行的操作对象,结合多个单独的操作,仍然是合理的。