2

この単純化された例があるとしましょう:
クラスのシリアル化と逆シリアル化を行うコードがいくつかあります...最初のバイトはクラスタイプをエンコードする列挙型です(それらはすべて同じベースから継承されます)。

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

//...

スイッチを置き換えることができるように、列挙型から型へのマップを持つ方法はありますか

c = new enum2Type(buffer);

edit ofc 私は raw ptr IRL を決して使用しません。:)

4

2 に答える 2

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);
于 2013-05-22T12:49:30.553 に答える
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);
于 2013-05-22T12:14:26.423 に答える