从库中重载函数
Overloading a function from a library
我目前正在为我的项目开发一个小而简单的序列化库。这涉及到一个调用自由模板函数的归档,该函数在默认情况下调用T的save成员函数:
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问题是我不知道如何让编译器找到重载的函数。我花了最后几个小时看boost代码,我试图找到诀窍。
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);
}
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载