【发布时间】:2018-11-16 08:23:54
【问题描述】:
我建立了一个小类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。
我的问题:有没有办法在不检查和访问 vaule/在两个单独的地方使用替换的情况下保护优雅的 oneliner?
【问题讨论】:
-
用
std::optional<Card>重载operator<<怎么样? -
或许提供免费功能
std::ostream & operator<<(std::ostream&, const std::optional<Card>&)。 -
类似
my_optional_visit(cardDeck.drawCard(), [](const Card&c){ std::cout << c; }, [](){ std::cout << "Out of Cards!" });。 -
@Jarod42 你能详细说明一下吗?
标签: c++ stdoptional