boost::序列化:是否可以避免模板函数
boost::serialization: is it possible to avoid template functions?
我有一个来自外部库的结构,我为它编写了一些非侵入式序列化方法。还有这个结构的包装器,我试图将所有依赖项从外部结构保留到这个包装器。问题是,所有序列化方法都是模板,因此它们在头文件中定义,并将依赖项从外部库传播到序列化包装器的每个人,这是我试图避免的。有可能解决这个问题吗?
UPD:最初我有这样的东西:
// serialization.h
#include <external_library.h>
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version) {
// ...
}
然后我尝试使序列化函数成为特定类型存档的非模板:
// serialization.h
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
struct ExternalStruct;
void serialize(boost::archive::binary_iarchive& archive, ExternalStruct& external_struct, const unsigned int version);
void serialize(boost::archive::binary_oarchive& archive, ExternalStruct& external_struct, const unsigned int version);
// serialization.cpp
#include <external_library.h>
#include "serialization.h"
void serialize(boost::archive::binary_iarchive& archive, ExternalStruct& external_struct, const unsigned int version) {
// ...
}
void serialize(boost::archive::binary_oarchive& archive, ExternalStruct& external_struct, const unsigned int version) {
// ...
}
但是后来我收到许多编译错误: no type named 'type' in 'struct boost::mpl::greater<boost::serialization::tracking_level<ExternalStruct>, mpl_::int_<0> >'
BOOST_STATIC_WARNING(typex::value);
我认为如果你在头文件中保留模板声明,你会得到更好的代码
// serialization.h
#include <external_library.h>
struct ExternalStruct;
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version);
然后,您将模板实现放入源文件中,以隐藏详细信息:
// serialization.cpp
#include "serialization.h"
#include <external_library.h>
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version)
{
// ... details here
}
最后,您将"显式实例化"用于计划使用的特定存档类型。此代码进入与上述相同的源文件。
// serialization.cpp continued
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
template void serialize(boost::archive::binary_iarchive& archive,
ExternalStruct& external_struct, const unsigned int version); // explicit instantiation.
template void serialize(boost::archive::binary_oarchive& archive,
ExternalStruct& external_struct, const unsigned int version); // explicit instantiation.
当然这是可能的。您可以为要使用的每个方法编写自己的函数。
维护起来非常丑陋,但这是一种无需任何模板即可使用的方式。
相关文章:
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关