让我说我有这个简化的例子:
我有一些代码可以对类进行序列化和反序列化...
第一个字节是编码类类型的枚举(它们都从相同的基类继承)。
例如
Color* c;
auto classType == read_byte(buffer);
switch (classType)
case eBlue:
{
c = new Blue(buffer);
}
case eGray:
{
c = new Gray(buffer)
}
//...
有没有办法从enum到类型的地图,所以我可以替换开关
c = new enum2Type(buffer);
编辑ofc我永远不会使用raw ptr IRL。:)
答案 0 :(得分:3)
template<typename T>
T* makeColor(Buffer const& buffer)
{
return new T(buffer);
}
...
std::map<ColerEnum, Color* (*)(Buffer const&)> m;
m[grayEnum] = makeColor<Gray>;
...
Color* c = m[typeByte](buffer);
答案 1 :(得分:1)
您可以使用带缓冲参数的地图或数组函数替换您的开关案例,并将(智能)指针返回Color
:
enum EnumType { blueEnum, grayEnum };
struct Buffer { .... };
struct Color { .... };
template <typename T>
Color* make_stuff(const Buffer& b) { return new T(b); }
然后
#include <functional>
#include <map>
...
// if you are sure enum values start at 0 and increase withoug jumps,
// you could use a plain array
std::map<EnumType, std::function<Color*(const Buffer&)>> m;
m[grayEnum] = make_stuff<Gray>;
m[blueEnum] = make_stuff<Blue>;
Color* c = m.at(classType);