是否可以将int(enum)映射为类型



假设我有这样一个简化的例子:
我有一些代码对一个类进行序列化和反序列化…第一个字节是编码类类型的enum(它们都继承自相同的基)..如:

    Color* c;
    auto classType == read_byte(buffer);
    switch (classType)
    case eBlue:
    {
       c = new Blue(buffer);
    }
    case eGray:
    {
       c = new Gray(buffer)
    }
//...

是否有办法从enum映射到类型,这样我就可以替换switch

c = new enum2Type(buffer);
我永远不会使用原始的ptr IRL.:)
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);

您可以使用带缓冲区参数的函数函数映射或数组替换switch case,返回指向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);

最新更新