2016-11-11 7 views
1

複数のユーザ定義型を格納するクラスを作成する必要があります。それは必要に応じて、それらのうちの1つを返すべきです。すべての型を返す関数を実装する方法はありますか?複数の型の格納と要求時の単一型の返却

注意:Boostライブラリは使用できません。私はあなたが仕事をしてstd::tupleクラスを持っているのVisual StudioでC++ 11では

class One {}; 
class Two {}; 
class Three {}; 

enum Type 
{ 
    OneType, 
    TwoType, 
    ThreeType 
}; 
class GenericType 
{ 
    template <typename T> // --- How to implement this function 
    T getValue(Type type) 
    { 
    switch(type) 
    { 
     case One: return oneType; // Error 
     case Two: return twoType; 
     case Three: return threeType; 
    } 
    } 
    shared_ptr<OneType> oneType; 
    shared_ptr<TwoType> twoType; 
    shared_ptr<ThreeType> threeType; 
    Type m_type; 
}; 

答えて

1

を実装する必要があります。あなたはこのように、std::getに必要な要素を取得することができます。

// Create a tuple 
std::tuple<std::shared_ptr<OneType>, std::shared_ptr<TwoType>> tuple{null, null}; 
// Get element 
std::get<std::shared_ptr<OneType>>(tuple) 
+0

std :: get()はインデックスの項目のみを取り出すことができます(引数として提供されます) – Neo

1

この宣言、

template <typename T> // --- How to implement this function 
T getValue(Type type) 

&hellip; Typeenumである場合、実行時の引数の選択は関数の結果の型のコンパイル時の選択を決定するか、または実行時の引数の値の選択が型のコンパイル時の選択と互換性がある必要があります。

前者は時間的に後退しているため、オンではなく、後者はまったくばかです。

普通の関数テンプレートがあなたにとって問題なければ、解決策は簡単です:関連するタイプごとに特化します。

ランタイムの選択が必要な場合は、代わりに共通の結果ラッパー・タイプを使用してください。価値意味論については、それはunionメンバーを有するクラス、すなわち識別された組合であることができる。参照セマンティクスの場合、可能な結果タイプの共通基本クラスへのポインタになることができます。

+0

申し訳ありませんが、私はそれを得ることができませんでした。一般的な結果ラッパーのタイプはどういう意味ですか? std :: tupleを意味しますか? – Neo

+0

@Neo:これは 'boost :: variant'のようなものです。 Boostを使うことができないので、あなた自身でそれをしなければならないでしょう。したがって、実装の提案。 'std :: tuple'は、メンバを公開するだけなので、何かの解決策ではありません。メンバを公開するだけで問題は解決され、クライアントコードには十分です。 –

関連する問題