Имам проблем с писането на рамка на C++, че потребителите трябва да имат по-малко режийни разходи, отколкото е възможно, за да я използват. Потребителите могат да публикуват работата си в рамките, като създадат споделена библиотека, която съдържа клас, който се извлича от BaseClass на рамката и имплементира външен "C" createInstance()-метод, за да върне екземпляр от неговия производен клас. Така рамката може да има достъп до потребителския клас чрез извикване на метода 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 и подходящо манипулиране на имената. (Знам всяко пространство от имена + име на клас от конфигурационен файл) Но не мисля, че това е правилно решение, особено извикването на конструктор не е същото като обикновено извикване на функция... но е много интересно...