У меня есть библиотека, где у меня есть класс шаблона, который принимает тип структуры в качестве аргумента шаблона и выполняет некоторые операции, такие как 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, все равно сможет загружать и использовать его, как будто ничего не изменилось. Таким образом, все изменения, кроме изменения интерфейса, не должны влиять на приложение.
Когда вы используете шаблоны, компилятор создает экземпляры (создайте типы/классы) во время компиляции. Следовательно, вам нужно знать, какой тип будет T
, чтобы создать экземпляр определенного класса в вашей DLL, что, как вы уверены, угадывает, невозможно.
Один хороший подход - создавать только библиотеки заголовков (например, большинство библиотек Boost). И предоставляйте свой API в *.hpp
файлах.
Если вы не хотите, чтобы другие видели ваш код, то есть много способов добиться этого, но это еще одна история.
Вы также можете быть заинтересованы в том, чтобы прочитать это: Преимущества только для заголовков