2010-12-02 8 views
1

はのは、私がこれを持っているとしましょう:任意の方法に使用するテンプレートの種類を知らないとき

class A 
{ 
    virtual int Method2(){/*...*/} 
}; 

template<typename T> 
class B<T> : public A 
{ 
public : 
    virtual int Method1(){/*...*/} 
    virtual int Method2(){/*...*/} 
}; 

は何かをすることが可能ですこれに似ています(これはもちろん動作しません...)?

A* a = ...; 

B* b = dynamic_cast<B*>(a); 

b->Method1(); 

おかげ

+0

テンプレートは型または関数ではなく、コンパイラが型または関数を作成するための「モデル」であることを覚えておいてください。そのため、タイプや関数の代わりに「裸の」テンプレートを使用することはできません。モデルの完全なインスタンスを使用する必要があります。 –

答えて

2

通常どんな人が仲介クラスを持っていますか。

class A { virtual ~A() {} }; 
class B : public A { virtual void method(); } 
template<typename T> class C : public B { 
    void method() { ... } 
}; 

A* a = new C<int>(); 
if(B* b = dynamic_cast<B>(a)) { 
    b->method(); 
} 

これはタイプ消去と呼ばれます。しかし、このシステムでは、Aはあまり目的を果たさない。

+0

これは私が使ったものですが、もっと簡単な方法があれば疑問に思っていました。クラス... – smichaud

+0

クラスAのポイントは何ですか?あなたは完全にそれを削除することができ、クラスBのままにしておきます。 –

+0

@VJo:クラスAは、私のコード例のように、実際にメソッドを実装する必要があります。ここでは単純化のための基本的な形です... – smichaud

1

はあなたが意味すると仮定すると:

template<typename T> 
class B { and the rest of it } 

その後、Bはクラスではないので、B*のようなものはありません。あなたのコードは、ケースBは、部外者が何らかの型T

...の内容のためB<T>を呼んでいるものを指しているクラステンプレートB、内部にある場合を除き、あまりにも非常に重要です。これは問題ありません:

A *a = new B<int>(); 
B<int> *b = static_cast<B<int>*>(a); 
b->Method1(); 

は最後に、クラスはあなたの例ではそうではない仮想関数を、唯一dynamic_cast持つことができる場合。

+0

私の間違った例を残念に思って、私の例を正確に修正しました... – smichaud

0
class A 
{ 
    //... 
}; 

template <class T> //you missed this line 
class B : public A //note the public keyword 
{ 
public : 
    int Method1(){/*...*/} 
}; 

今、あなたはBはそれがAClassはテンプレートだ、クラスではないことを

A* a = new B<char>; 

B<char>* b = dynamic_cast<B<char>*>(a); 

b->Method1(); 

注意を使用することができます。テンプレート引数を指定する必要があります

0

いいえ、Bは完全な型ではありません。 Bのようなものがないので、Bへのポインタを得ることはできません。

テンプレートを使用して実行時の多態性を達成しようとしているようです。そうですか?

0

Bは完全型でなければなりません。つまり、B <Something>です。それでは、通常のクラスと同じようにすることができますが、typeパラメータなしでクラスだけで行うことはできません。

関連する問題