我一直在使用存档器,最近不得不重新实现它。它基于我发现的this archiver lib,但我还必须添加对使用其类型信息序列化多态对象的支持。我一直在尝试通过利用模板推导来解决此问题,但这似乎并不正确。我了解到,使用推导会将生成的方法添加到重载池中,但是我还没有发现关于是否可以使用模板定义重载的任何信息。
这是我的代码段:
class Archive {
// ... ctor, and others
// ---
template <class T>
const Archive& operator<<(const T& v) const
{
*this & v;
return *this;
}
template <class T>
Archive& operator>>(T& v)
{
*this & v;
return *this;
}
// ---
template <class T>
Archive& operator&(T*& v)
{
Serializer::LoadObject(v);
return *this;
}
template <class T>
const Archive& operator&(const T*& v) const
{
Serializer::StoreObject(v);
return *this;
}
template <class T>
Archive& operator&(T& v)
{
v.Serialize(*this);
return *this;
}
template <class T>
const Archive& operator&(const T& v) const
{
((T&)(v)).Serialize(*this);
return *this;
}
// ... the rest of the implementation, serializers for POD, arrays and STL containers
};
此的基本用法是
struct SomePoco{
int m_someMember;
int m_someOtherMember;
template<class AR> void Srerialize(AR&ar){
ar & m_someMember & m_someOtherMember;
}
};
效果很好。如果我要使用对象的指针,它将看起来像这样-过于简化了,不必担心清洁程度,只是为了记录:
class SomeSerializableClass : public Serializable{
public:
// ... some macros that adds Serializable implementations
template<class AR> void Srerialize(AR&ar){
ar & m_someMember & m_someOtherMember;
}
private:
int m_someMember;
int m_someOtherMember;
}
SomeSerializableClass *obj = new SomeSerializableClass();
Archive ar;
ar << obj;
// ... rest of the stuff
在这种情况下,我想称呼安装了template <class T> const Archive& Archive::operator&(const T*& v) const
的{{1}}。推论是这样的:template <class T> const Archive& operator&(const T& v) const
其中template <class T> const Archive& operator&(const T& v) const
问题是: -是否有任何方法可以使用自定义扣除规则来覆盖此扣除行为,或者 -是否有任何方法可以禁用对指针类型的推导,因此我可以在类之外定义自己的运算符函数?
更新: 我已经通过type_trais下面的[em>建议挖了自己,而我对此一无所知。有了这种特征,它似乎在Visual Studio 2017上似乎并不起作用。
T = SomeSerializableClass *
我还咨询了VS中的实现;按规范template <class T, class = class std::enable_if<std::is_class<T>>::type>
Archive& operator&(T& v)
{
v.Serialize(*this);
return *this;
}
template <class T, class = class std::enable_if<std::is_class<T>>::type>
const Archive& operator&(const T& v) const
{
const_cast<T&>(v).Serialize(*this);
return *this;
}
对我来说很好,因为我正在寻找具有is_object
功能的那些对象,无论它们是类的实例还是结构的实例。但是,Serialize
在VS中是完全不同的东西,关闭特征是is_object
。
你们还有什么建议吗?