我建立了一个小类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();

09-13 13:11