2013-09-26 95 views
3

我有一個來自外部庫的結構,爲此我編寫了一些非侵入式序列化方法。還有我的包裝這個結構,我試圖保持從外部結構的所有依賴關係到這個包裝。問題是,所有的序列化方法都是模板,所以它們在頭文件中定義並從外部庫傳播到每個序列化包裝器的包裝器,我試圖避免。有沒有可能解決這個問題?boost :: serialization:是否可以避免模板函數?

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);

回答

3

我想,如果你把模板聲明在你頭文件

// 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. 
+0

這正是我終於做到的:) – lizarisk

0

當然這是可能的。 您可以爲每個想要使用的方法編寫自己的函數。

這是非常醜陋的維護,但一種方式,你可以使用,無需任何模板。

+0

你能否提供一些細節,我不太明白你的意思? – lizarisk

+0

只是不建立模板函數,而是爲每個模板使用自己的函數。 – dhein

+0

不幸的是,我無法完成這項工作,我在原始文章中發佈了更多細節。 – lizarisk

相關問題