2014-10-14 2 views
0

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

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, все равно сможет загружать и использовать его, как будто ничего не изменилось. Таким образом, все изменения, кроме изменения интерфейса, не должны влиять на приложение.

ответ

0

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

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

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

Вы также можете быть заинтересованы в ознакомлении с: Benefits of header-only libraries

Смежные вопросы