必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。
私が考えていたのは実行時に型を登録するようなクラスを使う方法です。
仮コードですが下記のような感じです。
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;
};
一応これでも要件は満たしているのですが、
いかんせんこれだと使うクラスを予め手動で登録している必要があり、
保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。
頂いた情報はこれから勉強します。
探検
C++相談室 part144
レス数が900を超えています。1000を超えると表示できなくなるよ。
901882です。
2019/09/08(日) 21:55:34.48ID:8BL9REycレス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 「働いて働いて」の流行語大賞に懸念 「言葉が独り歩き」 過労自殺遺族 [尺アジ★]
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化へ 過去10年間に使用のメールアドレスや電話番号等も★3 [Hitzeschleier★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★3
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★2
- TikTokの高市政権応援動画、限界突破 もう終わりだよこの国 [594040874]
- 【動画】テレビ朝日本社からの飛び降り、撮影されていたwwwwwwwwwwwwwwwwwwwwめちゃめちゃクルクルしてます… [802034645]
- 【悲報】高市早苗、被災民に対し「自分の命くらいは自分で守ってくださいね」と切り捨てし大炎上 [339712612]
