Как инвертировать зависимость шаблонов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как инвертировать зависимость шаблонов?

Сообщение Anonymous »

Если я хочу создать универсальный шаблон класса ResourceManager, который сериализует свой контент, вызывая функцию serialize (или шаблон), как выполнить вызов serialize< /em> ниже компилируемого?
Я не хочу объявлять этот шаблон функции, поскольку предполагается, что проект будет использовать ResourceManager с разными типами контейнеров, и я не хочу объявите все возможные контейнеры или включите этот файл в середину моих источников после такого объявления.
Могу ли я как-то избежать этого объявления или инвертировать зависимости, чтобы он работал с контейнерами std а также с моими типами?
В случае, если бы я работал только со своими типами, я бы сделал сериализовать их член класса, но я хочу работать с std< /code> контейнеры, а также без их упаковки.

Код: Выделить всё

#include 
#include 
#include 

// With this forward declaration it works
// template 
// void serialize(std::ofstream& ofs, std::vector& v);

template 
struct ResourceManager {
Resource& resourse;

ResourceManager(Resource& resourse) : resourse(resourse) {}

void store() {
std::ofstream ofs("vector_bin.vec", std::ios::trunc | std::ios::binary);

serialize(ofs, resourse);
}
};

template 
void serialize(std::ofstream& ofs, std::vector& v) {
auto size = v.size();
ofs.write((const char*)&size, sizeof(size));

ofs.write((const char*)v.data(), v.size() * sizeof(int));
}

int main()
{
std::vector v = { 1,2,3 };

ResourceManager rm(v);

rm.store();
}

Вот живая демонстрация.

Подробнее здесь: https://stackoverflow.com/questions/782 ... dependency
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»