首页 > 解决方案 > 如何将不同的 C++ 类映射到枚举类值

问题描述

我生成消息,每个消息都由一个对象接收,由enum class成员选择:

enum class ReceiverID
{
    R1,
    R2,
    MAX_NUM_RECEIVERS
};

struct Msg
{
    ReceiverID _receiverID;
    Data _data;
};

接收类存储在一个数组中。枚举成员索引数组以访问接收对象:

void receive(const Msg& msg)
{
    const size_t arrIndex = static_cast<size_t>(msg._receiverID);
    
    if(nullptr == _array[arrIndex])
    {
        _array[arrIndex] = ???  // How do I associate the enum to the class?
    }
    
     _array[arrIndex].processMsg(msg);
}

接收对象可能丢失。如果发生这种情况,我想使用枚举来实例化丢失的对象。但是,这需要将枚举值映射到接收对象类型。

如何将一个类映射到每个枚举?(对于所有枚举)。

如果添加了新枚举但没有相应的接收器类,我想生成编译器错误。

更新

接收对象是多态的,因此有一个基类。数组是:

std::array<Base*, MAX_NUM_RECEIVERS> _array;

(删除unique_ptr以简化问题)

标签: c++enumsscoped-enums

解决方案


对于对象的动态创建,我们可以使用某种工厂方法,例如:

//In the Base class:
static Base* createReceiver(ReceiverID recvID) //static member function
{
    switch (recvID)
    {
        case ReceiverID::R1: return new R1Receiver();
        case ReceiverID::R2: return new R2Receiver();
        //...
        default: throw std::logic_error("Invalid ReceiverID");
    }
}

//...
void receive(const Msg& msg) except(true)
{
    const size_t arrIndex = static_cast<size_t>(msg._receiverID);
    if(nullptr == _array[arrIndex])
    {
        _array[arrIndex] = Base::createReceiver(msg._receiverID);
    }    
    _array[arrIndex]->processMsg(msg);
}

推荐阅读