私はC++フレームワークを書く際に問題があります。ユーザーは、フレームワークのBaseClassによって派生したクラスを含む共有ライブラリを作成し、インスタンスの派生クラスを返すためにextern "C" createInstance()メソッドを実装することで、その作業をフレームワークに公開できます。したがって、フレームワークは、dlsym()を使用して共有ライブラリを介してcreateInstance-Methodを呼び出すことによって、ユーザークラスにアクセスできます。C++のファクトリパターン:明示的なcreateInstance() - メソッドの自動生成
フレームワークで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()を生成することが可能です - ユーザーが考える必要が `tをするように、各ユーザーライブラリ内の冗長である方法を、それについて?
別のアプローチは、私が直接介して、任意のユーザクラスのコンストラクタを呼び出していることを考えていた...
は、私はそれがテンプレート+マクロで可能だろうと思ったが、私はまだこれを行うための方法を発見していませんdlsymと適切な名前のmangling。 (私は設定ファイルから任意の名前空間+クラス名を知っています)しかし、私はこれは適切な解決策、特にコンストラクタ呼び出しは通常の関数呼び出しと同じではないと思っています...しかし、非常に興味深い...
ありがとうございます、1行は4より良いです;) – Dudero
あなたは大歓迎です! – bcsanches