реструктурировать классы для экспорта класса из DLL

0

У меня есть библиотека, где у меня есть класс шаблона, который принимает тип структуры в качестве аргумента шаблона и выполняет некоторые операции, такие как save (dump in file), open (открыть файл для сохранения данных структуры) и т.д.

template<class T>
class MyDataSaver{};

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

struct StructType
{
  int i;
  char ch;

  int size() { return sizeof(i) + sizeof(ch);}
  template<class Archive>
  void serialize(Archive ar){ar & i & ch;}
};

MyDataSaver<StructType> myData;
// And then
myData.save()
// and
myData.open().

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

Одним грубым подходом, о котором я могу думать, является создание нового класса шаблонов и наличие в нем байтового массива и его экспорт, а некоторые - как сохранить тип структуры через этот новый класс.

Я хочу динамически связанную DLL (не те библиотеки DLL, которые связаны с приложениями с использованием файлов lib), которое приложение может загрузить. Поэтому, если я вношу изменения в dll, например, сменил носители данных, или использовал функции crt файла, а не специфичные для ОС, приложение, использующее dll, все равно сможет загружать и использовать его, как будто ничего не изменилось. Таким образом, все изменения, кроме изменения интерфейса, не должны влиять на приложение.

Теги:
dll
templates

1 ответ

0

Когда вы используете шаблоны, компилятор создает экземпляры (создайте типы/классы) во время компиляции. Следовательно, вам нужно знать, какой тип будет T, чтобы создать экземпляр определенного класса в вашей DLL, что, как вы уверены, угадывает, невозможно.

Один хороший подход - создавать только библиотеки заголовков (например, большинство библиотек Boost). И предоставляйте свой API в *.hpp файлах.

Если вы не хотите, чтобы другие видели ваш код, то есть много способов добиться этого, но это еще одна история.

Вы также можете быть заинтересованы в том, чтобы прочитать это: Преимущества только для заголовков

Ещё вопросы

Сообщество Overcoder
Наверх
Меню