C++ 序列化:可以避免使用模板函数吗?

C++ 序列化:可以避免使用模板函数吗?,c++,serialization,boost,boost-serialization,C++,Serialization,Boost,Boost Serialization,我有一个来自外部库的结构,为此我编写了一些非侵入式序列化方法。还有我的这个结构的包装器,我试图保留从外部结构到这个包装器的所有依赖关系。问题是,所有序列化方法都是模板,所以它们都在头文件中定义,并将依赖关系从外部库传播到序列化包装器的每个人,这是我试图避免的。有可能解决这个问题吗 UPD:最初我有这样的想法: // serialization.h #include <external_library.h> template <typename Archive> vo

我有一个来自外部库的结构,为此我编写了一些非侵入式序列化方法。还有我的这个结构的包装器,我试图保留从外部结构到这个包装器的所有依赖关系。问题是,所有序列化方法都是模板,所以它们都在头文件中定义,并将依赖关系从外部库传播到序列化包装器的每个人,这是我试图避免的。有可能解决这个问题吗

UPD:最初我有这样的想法:

// serialization.h

#include <external_library.h>

template <typename Archive>

void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version) {
    // ...
}
//序列化.h
#包括
模板
无效序列化(存档和存档、外部结构和外部结构、常量未签名整数版本){
// ...
}
然后,我尝试使序列化函数成为特定类型存档的非模板:

// 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) {
    // ...
}
//序列化.h
#包括
#包括
结构外部结构;
void序列化(boost::archive::binary\u iarchive&archive、ExternalStruct&ExternalStruct、const unsigned int version);
void序列化(boost::archive::binary\u oarchive&archive、ExternalStruct&ExternalStruct、const unsigned int version);
//序列化.cpp
#包括
#包括“serialization.h”
void序列化(boost::archive::binary\u iarchive&archive、ExternalStruct&ExternalStruct、const unsigned int version){
// ...
}
void序列化(boost::archive::binary\u oarchive&archive、ExternalStruct&ExternalStruct、const unsigned int version){
// ...
}
但是我得到了很多编译错误:
在“struct boost::mpl::morer”中没有名为“type”的类型

BOOST\u STATIC\u警告(typex::value)

当然这是可能的。 您可以为希望使用的每个方法编写自己的函数


维护起来很难看,但这是一种不需要模板就可以使用的方法。

我认为如果在头文件中保留模板声明,您将获得更好的代码

// serialization.h

#include <external_library.h>

struct ExternalStruct;
template <typename Archive>
void serialize(Archive& archive, ExternalStruct& external_struct, const unsigned int version);
//序列化.h
#包括
结构外部结构;
模板
无效序列化(存档和存档、外部结构和外部结构、常量未签名整数版本);
然后将模板实现放入源文件中,其中隐藏了详细信息:

// 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
#包括“serialization.h”
#包括
模板
无效序列化(存档和存档、外部结构和外部结构、常量未签名整数版本)
{
//…这里有详细信息
}
最后,为您计划使用的特定归档类型设置“显式实例化”。这段代码进入与上面相同的源文件

// 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.
//serialization.cpp继续
#包括
#包括
模板无效序列化(boost::archive::binary\u iarchive&archive),
ExternalStruct&external_struct,const unsigned int version);//显式实例化。
模板无效序列化(boost::archive::binary\u oarchive&archive),
ExternalStruct&external_struct,const unsigned int version);//显式实例化。

你能提供更多的细节吗?我不太明白你的意思。只是不要构建模板函数,而是为每个模板使用自己的函数。不幸的是,我无法做到这一点,我在我原来的帖子中发布了更多的细节。我想我也帮不了你。对不起,这正是我最后做的:)