2016-06-15 8 views
1

私はこの子と同じタイプTの新しいオブジェクトを作成する必要があります。タイプChildの私のオブジェクトには、テンプレートされていない基本クラスParentがあります。私のChild型のオブジェクトへの唯一のアクセスは、Parent型のポインタを介してです。このポインタをParentにキャストして、正しくテンプレート化された型のChildオブジェクトへのポインタにすることは可能ですか?そうでなければ、ParentへのポインタからTを取得しますか?親から*子へのキャスト<T> *未知のT、および取得T

鋳造時にTを知っている唯一の例です。

struct Parent{ 

}; 

template <typename T> 
struct Child{ 
    typedef T ValueType; 

}; 

template <typename T> 
void foo(Parent*) { } 

// implementation 

Parent* object; // provided from somewhere else, points to Child<T> of unknown T 

foo<T>(object); // PROBLEM because T depends on what T the Child in object was templated with 
+0

ルック"デザインパターン – Leon

答えて

1

このような意味ですか(最小限の例)?編集とOPで追加されたスニペットを考慮

struct Parent { 
    virtual Parent * clone() = 0; 
}; 

template<class T> 
struct Child: Parent { 
    Child<T> * clone() override { 
     return new Child<T>; 
    } 
}; 

int main() { 
    Child<int> *c = new Child<int>; 
    Child<int> *cclone = c->clone(); 
    Parent *pclone = c->clone(); 
} 

EDIT

は、ここで(同じ考え方に基づいて)わずかに変更された例である:「プロトタイプで

struct Parent; 

template <typename T> 
void foo(Parent*) { } 

struct Parent{ 
    virtual void invokeFoo() = 0; 
}; 

template <typename T> 
struct Child: Parent { 
    void invokeFoo() override { 
     foo<T>(this); 
    } 
}; 

int main() { 
    Parent* object = new Child<int>; 
    object->invokeFoo(); 
} 
+0

私は自分の問題をよりよく説明しようとするために、私のOPに短いコードブロックを追加しました。 – pajosftw

+0

@pajosftw別の例を追加しました。 – skypjack

関連する問題