value_or的替代方法,对返回的类型无关紧要

Tho*_*ard 2 c++ stdoptional

我已经构建了一个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};
    }
}
Run Code Online (Sandbox Code Playgroud)

现在可以绘制一张卡片并处理空牌组的可能性是客户端代码使用的责任CardDeck,但是这个方法并不总是返回一个值.我喜欢那个解决方案.

无论如何,C++的新手我做了天真的ansatz:

std::cout<< cardDeck.drawCard().value_or("Out of cards!");

这作为失败的类型,"Out of cards!"就是char*但不是Card.

我的问题:有没有办法保证优雅的oneliner没有检查和访问vaule /在两个单独的地方使用替换?

Nat*_*ica 6

在我的选择中处理这个问题的最简单方法是为operator <<for 添加一个重载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;
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以了

std::cout << cardDeck.drawCard();
Run Code Online (Sandbox Code Playgroud)