2016-12-01 3 views
0

トピックが示唆するように、私は任意のデータ型を保持できるベクトルを作成しようとしています。私は、コードを将来的にはより保守しやすいようにテンプレートを使用しようとしています。任意のデータ型を保持できるテンプレート化されたジェネリックベクターを作成するのが難しい

#include<iostream> 
#include<memory> 
#include<vector> 

struct prime{ 
    public: 
     template<typename T> 
     T get(); 
}; 

template<typename T> 
struct foo: prime{ 
    public: 
     T i; 
     foo(T k):i(k){ 
     } 
     template<typename T1> 
     T1 get(){ 
      return i; 
     } 

}; 

/* 
struct fooString :prime{ 
    public: 
     std::string i; 
     fooString(std::string k):i(k){ 
     } 
}; 
*/ 
int main(){ 
    std::vector<std::shared_ptr<prime>> v; 
    std::shared_ptr<foo<int>> p1 = std::make_shared<foo<int>>(0); 
    std::shared_ptr<foo<char>> p3 = std::make_shared<foo<char>>('H'); 
    //std::shared_ptr<fooString> p2 = std::make_shared<fooString>("HK"); 
    v.push_back(p1); 
    v.push_back(p3); 
    //v.push_back(p2); 
    //std::cout<<v[0]->i<<" "<<v[1]->i<<std::endl; 
    //std::cout<<static_cast<foo<int>>(*v[0]).get(); 
    std::cout<<v[0]->get<int>(); 
} 

私はこの問題を解決しようとしています。しかし、私はこれを解読することができません。どんな提案も私には大いに役立ちます。私はthis SOに従ってみたが、私が言ったように、異なるデータ型の和集合を作成することは維持するのが難しい。また、boost::variantは、私が手で保持する必要があるすべてのタイプを与えなければならないので、どちらも役に立ちません。私はその制限を望んでいません。誰でも可能かどうか私に示唆することができますか、私は不可能を達成しようとしていますか? 私は、文字列をすべてキャストして保存するような、別のアルゴリズムを私の心に持っています。しかし、そのアプローチは適切に見えません。

ありがとうございました:)

+1

だから、なぜあなたは車輪の再発明していますか? 'std :: vector'を参照してください。すでにテンプレート化され、テスト済みです。 –

+0

@ThomasMatthewsこれは私が一見したところで考えたことですが、私はOPの問題が1つの 'std :: vector'に異なる型を得ていると思います。 – user4581301

+0

@ThomasMatthews OPはすでに 'std :: vector'を使用しています。OPは異なるデータ型を保持したいだけです。 – Barry

答えて

0

をあなたがしたいことはに任意のタイプを格納し、実際にあなたにそれについての情報を与えることができないコンテナを持っているのであれば - それはちょうど、どのタイプの各要素を知っているのはあなた次第です実際に格納している場合、それは正確にstd::anyBoost.Anyに基づいて)のためです。あなたのケースで

使用量は次のようになります。

int main(){ 
    std::vector<std::any> v; 
    v.push_back(0);     // an int 
    v.push_back('H');    // a char 
    v.push_back(std::string{"HK"}); // a string 

    std::cout << std::any_cast<int>(v[0]); // this will throw if v[0] is not an int 

    std::string* p = std::any_cast<std::string>(&v[1]); // this will return nullptr 
                 // if v[1] is not a string, which 
                 // it is not 
} 
+0

ああ...クール..私はブーストを見ていた:何分か前。どこかのコンテナやリストにのみデータ型を格納する方法はありますか?私はからtypeidに基づいてswitch文を作成できることを知っています。しかし、データ型だけを格納することができればそれはすばらしいでしょう。これとあなたの答えを組み合わせることで、C++でデータフレームを作成することができます。 – srinath29

+0

@ srinath29あなたが何を求めているのか分かりません。 – Barry

+0

心配しないで...ありがとう... – srinath29

関連する問題