- C++相談室 part144
901 :882です。[]:2019/09/08(日) 21:55:34.48 ID:8BL9REyc - 必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。
私が考えていたのは実行時に型を登録するようなクラスを使う方法です。 仮コードですが下記のような感じです。 template<typename BaseType> class InheritanceContainer{ struct IInheritance{ // BaseTypeを継承したクラスを生成 virtual BaseType* Create() const = 0; }; template<typename Type> struct Inheritance : public IInheritance{ virtual BaseType* Create() const{ return static_cast<BaseType*>( new Type() ); } }; public: // 型情報の登録 template<typename Type> bool Add(){ std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( ctti::nameof<Type>().cppstring() ); // ctti::nameof<Type>().cppstring() cttiライブラリーを利用して型の文字列を取得する if( it != m_InheritanceMap.end() ) return; m_InheritanceMap.insert( std::make_pair( ctti::nameof<Type>().cppstring(), new Inheritance<Type>() ) ); } // 文字列に合わせた BaseType を継承した物を生成 BaseType* Create( const std::string& _TypeText ){ std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( _TypeText ); return it != m_InheritanceMap.end() ? it->second->Create() : NULL; } private: std::unordered_map<std::string, IInheritance*> m_InheritanceMap; }; 一応これでも要件は満たしているのですが、 いかんせんこれだと使うクラスを予め手動で登録している必要があり、 保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。 頂いた情報はこれから勉強します。
|