2

オフセット配列クラスを作成しているときに (idx は 100 から 1000 までなので、配列の最初の 100 スロットを無駄にすることなくそれを考慮したクラスを作成します)、問題に遭遇しました。
要素の C 配列を持つクラスを初期化する方法 (問題は、T に def コンストラクターがないことです)。基本的に、配列を完全に初期化しないようにしたいと考えています。例:

class MyClass
{
    MyClass(int i)
    {

    }
};
template <typename T, size_t n, size_t offset>
struct offsetedIdxArray
{
    T data[n];// error line : error C2512: 'MyClass' : no appropriate default constructor available
    offsetedIdxArray()
    {

    }
    T& operator [](size_t pos)
    {
        return data[(pos-offset)];
    }

};

利用方法:

offsetedIdxArray<MyClass, 1024,offset> oia;

私が使用するクラスは実際にはライブラリクラスであるため、defコンストラクターを作成することはオプションではありません。

*編集: * ここに記載されている問題とは関係ありませんが、貴重なライブラリ クラスにはコピー ctor がなく、単に移動 ctor であることが判明したため、unique_ptr のベクトルを使用する必要がありました。

4

1 に答える 1

9

ストレージの静的サイズの初期化されていない部分を取得するには、C++11 のように、アラインされたストレージの「型指定されていない」バッファを使用できますstd::aligned_storage<sizeof(T[n]), alignof(T)>::type(C++03 では、 a を使用しchar[sizeof(T[n])+something]て手動でアラインメントを修正するか、またはchar[sizeof(T[n])]およびアラインメントを指定するコンパイラ拡張機能)。

つまり、コンストラクターには新しい配置を使用し、明示的なデストラクタは破壊を呼び出します。そのストレージのどの部分にオブジェクトがあるか (したがって、破棄が必要)、どの部分にオブジェクトがないか (デストラクタを呼び出すことができないか) を追跡するのはあなた次第です。また、クライアントがまったく初期化されていない要素を要求した場合 (本来あるべき場所にオブジェクトが存在しない場合) に対応するのもあなた次第です。

別の方法は、s の配列を使用するboost::optionalことです。そうすれば、破棄を気にする必要がなく、新しい要素をそれぞれのインデックスに割り当てるだけで済みます。

于 2012-09-06T16:51:29.027 に答える