ここにいくつかの列挙型クラスがあります:
enum class Race : char {AINU, ELF, DWARF, MAN, EAGLE, HOBBIT, ENT, ORC, WIZARD};
enum class Color: char {RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE};
enum class Direction: char{UP, DOWN, LEFT, RIGHT};
それぞれにenum_to_string関数とstring_to_enum関数を実装したいと思います。
同じ関数名をオーバーロードできるので、列挙型を文字列に変換するのに問題はありません。
std::string to_string(Race const& enum_value);
std::string to_string(Color const& enum_value);
std::string to_string(Direction const& enum_value);
ただし、列挙型に変換するときに同じ方法でオーバーロードすることはできません。これは、return-typeのみが異なるためです。(異なる列挙型が同じ文字列で表される可能性があるため、私もそうしたくありません。)
文字列を列挙型に変換するには、次のいずれかの方法が可能ですか?
Race race = to_enum<Race>("elf");
Color color = to_enum<Color>("green");
std::string blah{"up"};
Direction dir{to_enum<Direction>(blah)};
またはおそらく:
Race race = to_enum(Race,"elf");
Color color = to_enum(Color,"green");
std::string blah{"up"};
Direction dir{to_enum(Direction,blah)};
C ++はこれらの動作の一方または両方をサポートできますか?
私はこのような異なる関数名を避けようとしています:
Race to_race(std::string const& str);
Color to_color(std::string const& str);
Direction to_direction(std::string const& str);
これが私が思いつくことができる最も近いものです、
template <typename T>struct to_enum{};
template <>
struct to_enum<Color>{
static Color convert(std::string const& str){
//match the string with a color enum, and return that color enum
//(or like a default color enum if the string is garbage or something)
}
};
そして、あなたはそれをこのように呼びます:
Color color = to_enum<Color>::convert("red");
改宗者を取り除くことはできますか?またはおそらくこれを実装しますか?
Color color = to_enum(Color,"red");