与えられた基底クラスから継承したすべての包含オブジェクトを取り出すことを可能にする型消去パターンを作成する必要があります。私が知る限り、boost :: anyのような一般的なタイプの消去は、要求されたクラスとクラスが完全に一致する場合にのみany_castでオブジェクトを取得することを可能にします。テンプレート引数からの継承階層
テンプレート引数の継承関係を模倣するテンプレートクラスの問題を解決できました。この動作を達成するためのパターンが
// Suppose all clases have virtual destructors so that vtable and RTTI info are available
class ObjectWrapperBase {
}
template<class DataType>
class ObjectWrapperT: public ObjectWrapperBase {
public:
ObjectWrapperBase(T* ptr): dataObjPtr(ptr){}
DataType *dataObjPtr;
}
class Base{}
class Derived: public Base{}
class NotDerivedFromBase{}
int main(){
std::vector<ObjectWrapperBase*> v;
v.push_back(new ObjectWrapperT<Base>(new Base));
v.push_back(new ObjectWrapperT<Derived>(new Derived));
v.push_back(new ObjectWrapperT<NotDerivedFromBase>(new NotDerivedFromBase));
// Now suppose I want to retrieve all the Base and children objects in v
// If ObjectWrapperT<Derived> is a child of ObjectWrapperT<Base> I can write:
for(int i = 0; i < v.size(); i++){
ObjectWrapperT<Base> *wPtr = dynamic_cast<ObjectWrapperT<Base>*>(v[i]);
if(wPtr){
Base *basePtr = wPtr->dataObjPtr;
}
}
}
あります:次の例では、うまくいくように、例えば、TemplateClass<Derived>
は、TemplateClass<Base>
の子でなければなりませんか?あるいは最終的に別の解決策?おかげさまで
あなたの質問を正しく理解しているかどうか分からないので、私が間違っていれば私を修正してください - あなたの 'Derived'と' Base'は 'TemplateClass'から独立して作成され、内部で継承構造を知らないTemplateClassのもしそうなら、私は、あなたが望むものを達成できるとは思えません.C++型の特性は、クラスの直接の親を得るためのインタフェースを実装していないからです。 –
はい、DerivedとBaseはTemplateClassと何の関係も持っていません。私はC++で必要なものを得る方法がないことも自分自身に確信しています... –
'TemplateClass'のユーザにあなたの' Derived'' Base'関係の構造を決定させるなら、回避策を見つけることができます例えば'TemplateClass'から知られているカスタム特性を提供することで、ユーザが継承構造を' TemplateClass'と共有できるようにします。しかし正直なところ、これがあなたが本当に探しているものかどうかは分かりません。 [例](https://wandbox.org/permlink/FjScqN7hDAEwfSBc) –