我建立了一个小类Card
来重载<<
运算符,实质上是打印出卡片的花色和值。
实现细节与我想在这里提出的问题无关,只是假设是显而易见的。对于Card
,我建立了一个类CardDeck
。当然,CardDeck
可能会用光卡。这激发了我的尝试:
std::optional<Card> CardDeck::drawCard() {
if (this->Cards.empty()) {
return std::nullopt;
}
else {
Card card = this->Cards.front();
this->Cards.pop_front();
return std::optional<Card>{card};
}
}
现在可以使用一张卡片,使用
CardDeck
来处理客户代码,这是由客户代码负责的,但是很麻烦的是该方法并不总是返回值。我喜欢这种解决方案。不管怎样,我还是C++的新手,我做出了幼稚的ansatz:
std::cout<< cardDeck.drawCard().value_or("Out of cards!");
这失败,因为
"Out of cards!"
的类型是char*
而不是Card
。我的问题:有没有一种方法可以在不检查和接触迷路的情况下/在两个分开的地方使用替代品来保护优雅的内衬?
最佳答案
在我的意见中,最简单的方法是为operator <<
添加std::optional<Card>
重载。在这里,您可以处理打印内容的逻辑
std::ostream& operator <<(std::ostream& os, const std::optional<Card>& card)
{
if (card == std::nullopt)
return os << "Out of cards!";
else
return os << *card;
}
然后你就可以拥有
std::cout << cardDeck.drawCard();