簡體   English   中英

如何 map 不同的 C++ 類枚舉 class 值

[英]How to map different C++ classes to enum class values

我生成消息,每個消息都由一個 object 接收,由enum class成員選擇:

enum class ReceiverID
{
    R1,
    R2,
    MAX_NUM_RECEIVERS
};

struct Msg
{
    ReceiverID _receiverID;
    Data _data;
};

接收類存儲在一個數組中。 枚舉成員索引數組以訪問接收 object:

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);
}

接收 object 可能丟失。 如果發生這種情況,我想使用枚舉來實例化缺少的 object。 但是,這需要將枚舉值映射到接收 object 類型。

我怎樣才能對每個枚舉 map 一個 class ? (對於所有枚舉)。

如果添加了新枚舉但沒有相應的接收器 class,我想生成編譯器錯誤。

更新

接收對象是多態的,因此具有基礎 class。 數組是:

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

(刪除了unique_ptr以簡化問題)

對於動態創建對象,我們可以 go 使用某種工廠方法,例如:

//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);
}

而不是全局std::array<Base*, MAX_NUM_RECEIVERS> _array; 然后懶洋洋地按需填寫,我相信正常的做法是在施工時填寫:

std::array<Base*, MAX_NUM_RECEIVERS>& _array() {
    //use a method to bypass https://stackoverflow.com/questions/1005685/c-static-initialization-order
    static std::array<Base*, MAX_NUM_RECEIVERS> array = make_array();
    return array;
}
std::array<Base*, MAX_NUM_RECEIVERS> make_array() {
    std::array<Base*, MAX_NUM_RECEIVERS> array;
    array[static_cast<size_t>(R1)] = &myR1ProcessorObject();
    array[static_cast<size_t>(R2)] = &myR2ProcessorObject();
    return array;
}

那么你的接收方法很簡單:

void receive(const Msg& msg)
{
    const size_t arrIndex = static_cast<size_t>(msg._receiverID);
    assert(arrIndex< MAX_NUM_RECEIVERS);
     _array()[arrIndex].processMsg(msg);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM