例えば
enum Color {RED, BLUE, YELLOW};
そしてシリアルで型をシリアライズしたい
Color c = RED;
JSONOutputArchive archive(std::cout);
archive(c);
出力は次のようになります
"value0" : "RED"
また
"value0" : RED
例えば
enum Color {RED, BLUE, YELLOW};
そしてシリアルで型をシリアライズしたい
Color c = RED;
JSONOutputArchive archive(std::cout);
archive(c);
出力は次のようになります
"value0" : "RED"
また
"value0" : RED
列挙値に指定した名前はコンパイラだけが知っているため、目的の出力は、シリアル化ライブラリが自動的に実行できないものです。
一般に、このような状況では、文字列表現と列挙型の数値との間で変換できるコードを提供する必要があります (例: Enum から String C++ へ)。または、これを自動的に行うライブラリを使用する必要があります。
この機能があると仮定しましょう。次に、列挙型に特化した最小限のシリアル化関数のペアを記述する必要があります。
これは完全に機能する例です。列挙型から文字列への移行をどのように選択するかはあなた次第です。私は 2 つのマップを使用しましたが、それは私の側で実際の努力を必要としなかったためですが、必要なコードをすべて生成するマクロの背後にこれらすべてを簡単に隠すことができます。 :
#include <cereal/archives/json.hpp>
#include <iostream>
#include <sstream>
#include <map>
enum Color {RED, BLUE, GREEN};
enum AnotherEnum {HELLO_WORLD};
std::map<Color, std::string> ColorMapForward = {{RED, "RED"}, {BLUE, "BLUE"}, {GREEN, "GREEN"}};
std::map<std::string, Color> ColorMapReverse = {{"RED", RED}, {"BLUE", BLUE}, {"GREEN", GREEN}};
std::string Color_tostring( Color c )
{
return ColorMapForward[c];
}
Color Color_fromstring( std::string const & s )
{
return ColorMapReverse[s];
}
namespace cereal
{
template <class Archive> inline
std::string save_minimal( Archive const &, Color const & t )
{
return Color_tostring( t );
}
template <class Archive> inline
void load_minimal( Archive const &, Color & t, std::string const & value )
{
t = Color_fromstring( value );
}
}
int main()
{
std::stringstream ss;
{
cereal::JSONOutputArchive ar(ss);
ar( RED );
ar( BLUE );
ar( GREEN );
ar( HELLO_WORLD ); // uses standard cereal implementation
}
std::cout << ss.str() << std::endl;
std::stringstream ss2;
{
cereal::JSONInputArchive ar(ss);
cereal::JSONOutputArchive ar2(ss2);
Color r, b, g;
AnotherEnum a;
ar( r, b, g, a );
ar2( r, b, g, a );
}
std::cout << ss2.str() << std::endl;
}
出力として与える:
{
"value0": "RED",
"value1": "BLUE",
"value2": "GREEN",
"value3": 0
}
{
"value0": "RED",
"value1": "BLUE",
"value2": "GREEN",
"value3": 0
}