在结构中自动索引枚举ID

Auto-indexing enum ids within structure

本文关键字:索引 枚举 ID 结构      更新时间:2023-10-16

我在struct中有以下enum

struct FOODS
{
    enum FRUIT
    {
         ORANGE,
         BANANA,
         PINEAPPLE
    };
    enum VEG
    {
        GINGER,
        GARLIC,
        ONION
    };
    enum DRINK
    {
        WATER,
        COFFEE
    };
};

我使用它们作为std::vector的数组索引id,就像array[FOODS::FRUIT::ORANGE]一样,但我需要按顺序正确地对它们进行索引。我可以使用:

struct FOODS
{
    enum FRUIT
    {
         ORANGE = 0,
         BANANA,
         PINEAPPLE
    };
    enum VEG
    {
        GINGER = 3,
        GARLIC,
        ONION
    };
    enum DRINK
    {
        WATER = 6,
        COFFEE
    };
};

但是,如果顶部的两个枚举中的任何一个发生了更改,我就必须手动管理所有三个枚举。还有什么更好的办法呢?

建议1:

struct FOODS
{
    enum FRUIT
    {
         ORANGE,
         BANANA,
         PINEAPPLE,
         FRUIT_SIZE
    };
    enum VEG
    {
        GINGER = FRUIT_SIZE,
        GARLIC,
        ONION,
        VEG_SIZE
    };
    enum DRINK
    {
        WATER = VEG_SIZE,
        COFFEE,
        DRINK_SIZE
    };
};

注意:你不能做下一步:

struct FOODS {
    enum FRUIT
    {
         ORANGE,
         BANANA,
         PINEAPPLE,
         SIZE
    };
    enum VEG
    {
        GINGER = FRUIT_SIZE,
        GARLIC,
        ONION,
        SIZE
    };
    enum DRINK
    {
        WATER = VEG_SIZE,
        COFFEE,
        SIZE
    };
};

因为您可能需要重新声明名称(FOODS::SIZE)。

建议2:

struct FOODS
{
    enum class FRUIT
    {
         ORANGE,
         BANANA,
         PINEAPPLE,
         SIZE
    };
    enum class VEG
    {
        GINGER = FRUIT::SIZE,
        GARLIC,
        ONION,
        SIZE
    };
    enum class DRINK
    {
        WATER = VEG::SIZE,
        COFFEE,
        SIZE
    };
};

enum class解决了枚举作用域中的名称重叠问题
请注意,强枚举(enum class)是从C++11开始支持的。