У меня проблема с написанием фреймворка C++, так как у пользователей должно быть меньше накладных расходов, чем это возможно для его использования. Пользователи могут опубликовать свою работу в фреймворках, создав разделяемую библиотеку, содержащую класс, производный от базового класса фреймворка, и реализуя внешний C-метод createInstance() для возврата экземпляра его производного класса. Таким образом, фреймворк может получить доступ к пользовательскому классу, вызвав метод createInstance-Method через разделяемую библиотеку с помощью dlsym().
class BaseClass{}
class UserClass : public BaseClass{}
extern "C"{
BaseClass* UserXcreateInstance(){
return new UserClass();
}
}
В рамках:
typedef BaseClass* (*CreateInstance) ();
void* handle;
CreateInstance createInstance;
handle = dlopen( "libUserLibrary.so", RTLD_LAZY | RTLD_GLOBAL );
createInstance = reinterpret_cast <CreateInstance*> dlsym( handle, "UserXcreateInstance" );
BaseClass* userX = createInstance();
Мой вопрос: Можно ли сгенерировать метод UserXcreateInstance(), который является избыточным в каждой пользовательской библиотеке, чтобы пользователю не приходилось об этом думать?
Я думал, что это будет возможно с шаблонами + макросами, но я еще не нашел способ сделать это...
Другой подход, о котором я думал, - это прямой вызов конструктора любого пользовательского класса через dlsym и соответствующее изменение имени. (Я знаю любое пространство имен + имя класса из файла конфигурации) Но я не думаю, что это правильное решение, особенно вызов конструктора не то же самое, что вызов обычной функции... но очень интересно...