私はC++フレームワークを書く際に問題があり、ユーザーはそれを使用できるよりもオーバーヘッドが少ないはずです。ユーザーは、フレームワークの BaseClass から派生したクラスを含む共有ライブラリを作成し、その派生クラスのインスタンスを返すために extern "C" createInstance() メソッドを実装することで、自分の作業をフレームワークに公開できます。したがって、フレームワークは、dlsym() を使用して共有ライブラリを介して createInstance-Method を呼び出すことにより、ユーザー クラスにアクセスできます。
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 と適切な名前マングリングを介して任意のユーザー クラスのコンストラクターを直接呼び出すことを考えていました。(構成ファイルから名前空間とクラス名を知っています)しかし、これが適切な解決策だとは思いません。特に、コンストラクター呼び出しは通常の関数呼び出しと同じではありません...しかし非常に興味深い...