我目前正在为我的项目工作一个小而简单的序列化库。这涉及一个调用自由模板函数的存档,默认情况下调用T:
的存储成员函数template<typename Archive, typename T>
inline void save(Archive& a, const T& v)
{
v.save(ar);
}
现在我想在库外部重载此函数以支持没有save方法的类型:
/* A.h */
Class A {/**/};
template<typename Archive>
inline void save(Archive& a, const A& v)
{
a << member; //etc
}
在main.cpp中:
#include "serialization/OStreamArchive.h
#include "a.h"
int main()
{
OStreamArchive<std::ofilestream> ar(somefstream);
A a;
ar << a;
}
从概念上讲,它应该像boost序列化库一样工作:http://www.boost.org/doc/libs/1_59_0/libs/serialization/doc/tutorial.html#nonintrusiveversion 问题是我不知道如何让编译器找到重载函数。我花了最后几个小时查看增强代码,我试图找到技巧。
保存的完整调用结构如下:
/* OFileStream.h */
template<typename T>
OStreamArchive& operator<<(const T& value)
{
serialization::commonSave(*this, value);
}
/* save.h */
template<typename Archive, typename T>
inline void save(Archive& archive, const T& value)
{
serialization::Access::save(archive, value); //call T::save
}
template<typename Archive, typename T>
inline void commonSave(Archive& archive, const T& value, std::false_type)
{
serialization::save(archive, value);
}
template<typename Archive, typename T>
inline void commonSave(Archive& archive, const T& value)
{
//primitives get extra treatment
serialization::commonSave(archive, value, typename std::is_fundamental<T>::type());
}
答案 0 :(得分:2)
当您创建从模板中使用的自定义点时,将使用ADL进行查找。也就是说,需要在与至少与参数相关联的命名空间中找到该功能的定制版本。当然,您还需要确保不使用合格的呼叫来调用定义保管点的功能。
如果您使用此定义,则应找到save()
的特殊版本:
template <typename Archive, typename T>
inline void commonSave(Archive& archive, T const& value, std::false_type) {
using serialization; // find things in namespace serialization if
// if there is no better version
save(archive, value);
}