我正在使用yaml-cpp進行某種類型的序列化。對於這項工作的每個類都有使用簽名來聲明一個方法:yaml-cpp,YAML :: Node和一個模板操作符>>
template <typename T> void Serialize(T& s);
這T
是不同的類保存和加載時。這兩個類的接口是相同的,但我不能創建抽象基類,因爲大多數方法都是模板。這部分工作正常。我試圖把它與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)和鐺(2.9)都不理它,並使用nodeimp.h定義(YAML-CPP的一部分)operator>>
:
template <typename T>
inline void operator >> (const Node& node, T& value) {
if(!ConvertScalar(node, value))
throw InvalidScalar(node.m_mark);
}
所以我的問題是:我應該如何解決這個問題?我絕對需要的是隻有一種方法,用於序列化和反序列化,並且能夠使用>>和<,就像它是由yaml-cpp支持的正常類型一樣。
奇怪,我試過'static_cast',它沒有工作,但現在它的工作。 (也許我試圖投到T,而不是T *?)。無論如何,你的補丁很好,感謝修復。 –