2011-12-11 31 views
0

たとえば、Valueのようなクラスがあるとします。インタフェースはメソッド名のみを指定できますが、戻り値の型は指定できませんか?

template <typename T> 
class Value : public ValueInterface 
{ 
    public: 
     // ... 
     T getValue() const; 

    private: 
     T value_; 
} 

は、私が(例えば、コンテナを作成するために)一般的に私のコードで(つまり、異なるTタイプで、である)異なるタイプの複数Value Sを参照してくださいことはできますか? 、あなたは別のソリューションを提供することができ

class ValueInterface 
{ 
    public: 
     ?? getValue() const = 0; 
} 

template <typename T> 
class Value : public ValueInterface 
{ 
    // ... 
} 

std::list<ValueInterface> lst; 
Value<int> i(...); 
Value<char> c(...); 

lst.push_back(i); 
lst.push_back(c); 

int vi = i.getValue(); 
char vc = c.getValue(); 

を、それが不可能な場合:私の最初に考えたのは、それが何らかの形でValueを継承することができ、そこから純粋な抽象クラスを宣言することは可能かどうでしたか?

+2

あなたは、このような機能を使用したいのですがどのようにの擬似コードの例を与えることができますか? –

+0

これは2番目のスニペットにあります。異なる 'Value'を保持する' std :: list'を宣言する必要があります。 –

+0

しかし、それはあなたの 'getValue'メソッドと何が関係していますか? –

答えて

1

++すべての式は、コンパイラに知られているタイプを持っている必要がありますが、あなたのソリューションにlst.begin()->getValue()は、任意の特定のタイプを持っていないでしょう。

あなたはあなたの例をよく見ればあなただけのサブクラスのバージョン、どこでもValueInterface::getValue()を呼び出していませんが。

あなたは次のことを試すことができます。

class ValueInterface 
{ 
    public: 
    template <typename T> 
    T getValue() const 
    { 
     return dynamic_cast< const Value<T> &>(*this).getValue(); 
    } 
    virtual ~ValueInterface() 
    { } 
}; 

template <typename T> 
class Value : public ValueInterface 
{ 
    public: 
     // ... 
     T getValue() const; 

    private: 
     T value_; 
}; 

getValue()ではない(とすることはできません)仮想こと。あなたはgetValue呼び出しで間違ったタイプを使用する場合は、例外std::bad_castがスローされます

int z = lst.begin()->getValue<int>(); 

今、あなたはあなたの例からコードを書くだけでなく、することができます。

+2

'dynamic_cast'が動作するには、少なくとも1つの仮想関数が必要です。 – Xeo

+0

@Xeo良い点。ここではデストラクタが最適です。更新しました。 – rodrigo

0

それが曖昧のすべての種類を作成してあなたは、戻り値の型にオーバーロードすることはできません。

私はあなたがここで何をしようとしてはかなりよく分かりません。私はあなたがblah以上を反復するか、それからランダムな要素を選んで、上記の要素にgetValue()を呼び出していると仮定しています。この呼び出しは、絶対に任意の型を返すことができます:charconst void*Value< Value< Value<const void*> > >、などあなたが結果で何をしますか?あなたはそれのための変数をどのように定義しますか? Cでは

+0

blahを使用する関数は、どの要素がどの型を返すかを知り、それに応じて変数を宣言します。 –

+0

@Dan:使用している変数の型をコンパイル時に知っていれば、まず多態性は必要ありません。 – suszterpatt

関連する問題