8

C++で異なる型の複数の順序付きタプルの配列を作成することは可能ですか? たとえば、すべてのタプルに 1 つの int、1 つの文字列、および 1 つの double が含まれるタプルの配列を作成できるようにしたいと思いますか? 次のようなものです:

  vector<pair<pair<int, string>, double> >;

これで、タプル (2,"3", 5.43) を持つことができました。ここでの問題は、一般に、タプルのサイズが事前にわからないことです。したがって、2 つの要素のみ、または 5 つの要素、または例のように 3 つの要素であり、すべて異なるタイプである可能性があります。また、順序も異なる場合があります。C++ でこのようなことを行うことは可能ですか、それとも Python に切り替える必要がありますか?

4

3 に答える 3

12

配列は、(同じサイズの) オブジェクトを体系的に配置したものです。C/C++ では、可変サイズの要素の配列を作成できません。

ただし、ポリモーフィズムを使用してこれをアクティブにすることができます。

抽象型ポインターの配列を作成し、その型に基づいて配列要素をキャストします。

例:

namespace Array {
    enum Type  {
        Type1T,
        Type2T,
    };

    class AbstractType {
        public:
            virtual Type GetType() = 0;
            virtual ~AbstractType() {} 
    };

    class Type1 : public AbstractType  {
        public:
            Type GetType() { return Type1T;}

            int a;
            string b;
            double c;
    }; 

    class Type2 : public AbstractType  {
        public:
            Type GetType() { return Type2T;}

            int a;
            string b;
            string c;
            double d; // whatever you want
    };
}

そして、複数の異なるタイプの配列を次のように作成します。

vector<Array::AbstractType*>  my_array;
于 2013-10-30T09:36:26.770 に答える
6

のベクトルにc++は、すべての要素が同じ型になります。別の方法として、vectorofvectorを使用することもできますが、ここでも、内側のベクトルの要素は同じ型である必要があります。

おそらく、解決しようとしている問題は、達成しようとしている問題よりも優れた解決策を持っているでしょう。醜くて絶対にお勧めできない解決策があります - 使用することvector<vector<void*> >ですが、これは危険であり、維持できません。

特定の型セットの要素のみを持つ場合は、そこにあるすべての型の実装を持つ抽象型を作成します。たとえば、 、 、 で定義しMyTypeて継承します。次に、たとえば a を宣言します (内部ベクトルの代わりに scoped_array などを使用することをお勧めします)。MyTypeIntMyTypeDoubleMyTypeStringvector<vector<MyType*> >

編集: nijansen のコメントによると、ブーストが利用可能な場合は、Boost.Variant のベクトルのベクトルを作成できます。

于 2013-10-30T09:14:18.533 に答える