如何使用枚举类值作为for循环的一部分?

DBe*_*nko 7 c++ enums loops c++11

我试图通过遍历枚举创建一副扑克牌SuitRank(我知道有没有遍历枚举好办法,但我没有看到另一种).我通过enum_count在每个枚举的末尾添加一个枚举器来做到这一点,其值用于表示枚举的长度和结尾.

#include <vector>

using namespace std;

enum class Suit: int {clubs, diamonds, hearts, spades, enum_count};
enum class Rank: int {one, two, three, four, five, six, seven, eight,
                nine, ten, jack, queen, king, ace, enum_count};

struct Card {
    Suit suit;
    Rank rank;
};

class Deck{
    vector<Card> cards{};
    public:
        Deck();
};

Deck::Deck() {
    // ERROR ON THE BELOW LINE
    for (Suit suit = Suit::clubs; suit < Suit::enum_count; suit++) {
        for (Rank rank = Rank::one; rank < Rank::enum_count; rank++) {
            Card created_card;
            created_card.suit = suit;
            created_card.rank = rank;
            cards.push_back(created_card);
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试遍历枚举时,编译器不喜欢我试图在for循环中递增,suit++rank++声明:

card.cpp|24|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
card.cpp|25|error: no ‘operator++(int)’ declared for postfix ‘++’ [-fpermissive]|
Run Code Online (Sandbox Code Playgroud)

在不丢弃有用的枚举数据结构的情况下创建一副牌的最佳方法是什么?

hls*_*lon 5

我建议做一些与众不同的事情.创建一个矢量Suit和一个Rank,并使用STL的力量循环它们

const std::vector<Suit> v_suit {Suit::clubs, Suit::diamonds, Suit::hearts, Suit::spades};

const std::vector<Rank> v_rank {Rank::one, Rank::two, Rank::three, Rank::four, Rank::five, 
                          Rank::six, Rank::seven, Rank::eight, Rank::nine, Rank::ten, Rank::jack, 
                          Rank::queen, Rank::king, Rank::ace};
Run Code Online (Sandbox Code Playgroud)

是的,你必须输入两次,但这允许你使用你想要的任何值(即不连续),而不是使用尴尬的东西enum_count(你想要什么卡?给我一个钻石enum_count !!),不需要进行铸造,并使用提供的迭代器std::vector.

要使用它们:

for(const auto & s : v_suit)
    for (const auto & r : v_rank)
        cards.push_back({s,r});
Run Code Online (Sandbox Code Playgroud)