从库中重载函数

Overloading a function from a library

我目前正在为我的项目开发一个小而简单的序列化库。这涉及到调用免费模板函数的存档,该函数默认调用 T:

的保存成员函数
template<typename Archive, typename T> 
inline void save(Archive& a, const T& v)
{
    v.save(ar);
}

现在我想在库外重载这个函数以支持没有保存方法的类型:

/* 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 问题是我不知道如何让编译器找到重载函数。我花了最后几个小时查看提升代码,并试图找到诀窍。

完整的save调用结构如下:

/* 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()); 
}

当您创建从模板中使用的自定义点时,系统会使用 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);
}