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


person lizarisk    schedule 26.09.2013    source источник


Ответы (2)


Я думаю, вы получите более приятный код, если сохраните объявление шаблона в заголовочном файле.

// 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.
person Michael Simbirsky    schedule 15.12.2013
comment
Это именно то, что я наконец сделал :) - person lizarisk; 17.12.2013

Конечно, это возможно. Вы можете написать собственную функцию для каждого метода, который хотите использовать.

Это довольно уродливо в обслуживании, но вы можете использовать его без каких-либо шаблонов.

person dhein    schedule 26.09.2013
comment
Не могли бы вы подробнее рассказать, я не совсем понимаю, что вы имеете в виду? - person lizarisk; 26.09.2013
comment
Просто не создавайте шаблонные функции, а вместо этого используйте для каждого шаблона собственную функцию. - person dhein; 26.09.2013
comment
К сожалению, я не могу это сделать, я разместил более подробную информацию в своем исходном сообщении. - person lizarisk; 26.09.2013
comment
@lizarisk Думаю, дальше я ничем не могу тебе помочь. Извиняюсь. - person dhein; 26.09.2013