c++ - 如何将不同的 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
以简化问题)
解决方案
对于对象的动态创建,我们可以使用某种工厂方法,例如:
//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);
}
推荐阅读
- android - 离子 ngIf 返回语句永远循环
- python - 如何将列表的 pandas DataFrame 列转换为新行?
- revit-api - 在 WorksharedOperationProgressChanged 事件中使用不同的事件参数 - Revit API
- heroku - 是否可以获取 Heroku 仪表板的日志?
- angular - 角材料垫卡未正确显示拉丁字母字符
- powershell - 使用 Powershell 修改 SCCM 应用程序部署失败
- ios - 我的视图是透明的,如何使组件不透明
- laravel - .htaccess - 从代理重定向中排除特定的 URL 和目录
- xamarin.forms - 在 xamarin.forms 中为 android 自定义标签页
- python - Python/API:处理服务器不返回的错误