У меня есть проблема при написании фреймворка C ++, что пользователи должны иметь меньше накладных расходов, чем это возможно. Пользователи могут публиковать свои работы в каркасах, создав общую библиотеку, которая содержит класс, производный от BaseClass платформ, и реализовав метод exIn createInstance () extern для возврата экземпляру его производного класса. Таким образом, инфраструктура может получить доступ к пользовательскому классу, вызвав метод createInstance через общую библиотеку с помощью 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 и подбирать подходящие имена. (Я знаю любое пространство имен + имя класса из файла конфигурации) Но я не думаю, что это правильное решение, особенно вызов конструктора - это не то же самое, что обычный вызов функции ... но очень интересно ...