0

私はintでテンプレート化されたクラスを持っています(つまり:

template </*...*/, int a> /*...*/

)。私のクラスでは、正確に「a」個の引数を取るコンストラクターが必要です。もちろん、可変長にすることもできますが、可能であればコンパイル時に長さをチェックしたいと思います。マクロ ハックも機能する可能性があると思いますが、組み込みの C++ 機能を探すことから始めています。

これは C++ で可能ですか?

4

1 に答える 1

2

同じ型の値のシーケンスを処理することが配列の目的です。

生の配列を使用する必要さえありません。C++11 では を使用できますstd::array

例:

template< int a >
class MyClass
{
public:
    MyClass( std::array< int, a > const& args )
    {}
};

コンパイラが提供しない場合はstd::array、対応するクラスを非常に簡単に定義するか、生の配列を使用できます。

template< int a >
class MyClass
{
public:
    MyClass( int const (&args)[a] )
    {}
};

うーん、私は&そこに正しい配置を得たといいのですが。理解できない何らかの理由で、私はいつもその構文を忘れています。何度使っても。


OPがコメントで(1)C ++ 11を持っていないこと、および(2)次のような単純な宣言構文が必要であることを明確にしていることを考えると

MyClass<4> m(0,1,2,3);

1 つの可能性はMyClass、C++03 の中括弧初期化子 (つまり、ユーザー定義のコンストラクターなし) で初期化できる集計を作成することです。

#include <stddef.h>

typedef ptrdiff_t Size;
typedef Size Index;

template< Size a >
class MyClass
{
public:
    static Size const n = a;
    static Size size() { return n; }

    int elems_[n];
    int operator[]( Index const i ) const { return elems_[i]; }
    int& operator[]( Index const i ) { return elems_[i]; }
};

#include <iostream>
using namespace std;
int main()
{
    MyClass< 3 > x = {100, 200, 300};
    for( int i = 0;  i < x.size(); ++i )
    {
        wcout << x[i] << endl;
    }
}

この解決策が受け入れられる場合は、基本的に再実装する必要がありstd::arrayます。

于 2012-10-06T00:35:25.603 に答える