yaml-cppを使用してある種のシリアル化を行っています。これを機能させるには、各クラスでシグネチャを使用してメソッドを宣言する必要があります。
template <typename T> void Serialize(T& s);
これT
は、保存時と読み込み時の別のクラスです。2 つのクラスのインターフェイスは同じですが、ほとんどのメソッドがテンプレートであるため、抽象基本クラスを作成できません。この部分は正常に動作しています。私はそれを と で接続しようとYAML::Node
しoperator>>
ましYAML::Emitter
たoperator<<
。
についてoperator<<
は、非常に残酷ではありますが、実用的な解決策があります。まず、シリアライズ可能なすべてのクラスのスーパークラスを宣言します。
template <typename T> class Serializable {};
次に、次を使用できますoperator<<
。
template <typename T>
YAML::Emitter& operator<<(YAML::Emitter& out,
Serializable<T>& val)
{
Serializer serializer(out);
reinterpret_cast<T*>(&val)->Serialize(serializer);
return out;
}
これreinterpret_cast
はかなり恐ろしく見えますが、今のところ機能しており、合法であるかどうかさえわかりません. についても同じことを試みましたが、うまくいきませoperator>>
んでした。次のようになります。
template <typename T>
void operator>>(const YAML::Node& node,
Serializable<T>& val)
{
Deserializer deserializer(node);
reinterpret_cast<T*>(&val)->Serialize(deserializer);
}
しかし、gcc (4.6.2) と clang(2.9) はどちらもそれを無視し、operator>>
nodeimp.h (yaml-cpp の一部) で定義されたものを使用します。
template <typename T>
inline void operator >> (const Node& node, T& value) {
if(!ConvertScalar(node, value))
throw InvalidScalar(node.m_mark);
}
私の質問は次のとおりです。これをどのように解決すればよいですか?私が絶対に望んでいるのは、シリアライゼーションとデシリアライゼーションの両方に 1 つのメソッドだけを用意し、yaml-cpp でサポートされている通常の型のように >> と << を使用できるようにすることです。