8

テンプレート クラスの c++0x std::array メンバーがあり、いくつかの反復子を受け取るコンストラクターを使用してそれを初期化するとします。

template <typename Tp, size_t N>
class Test 
{
public:
    template <typename Iterator>
    Test(Iterator first, Iterator last)
    {
        if (std::distance(first,last) > N )
            throw std::runtime_error("bad range");
        std::copy(first, last, _M_storage.begin());
    }

private:
    std::array<Tp, N> _M_storage;

};

ストレージのサイズと一致する範囲を提供していると仮定すると、コンストラクター初期化子で std::array を初期化し、ストレージ内の Tps の余分なデフォルト コンストラクターを回避することは可能ですか? この場合、 std::initializer_list<> を悪用することは可能ですか?

4

1 に答える 1

3

いいえ。

std::arrayは集合体であるため、コンストラクターがイテレーターを使用するような特別な機能はありません。(これは実際に私を驚かせますstd::initializer_list。他の有用なコンストラクターを作成することに害はないと思います。おそらく質問が待ち構えています。)

つまり、イテレータを使用して配列内のデータをコピーする唯一の方法は、反復することです。これを行うには、arrayがすでに構築されており、使用できる状態になっている必要があります。

于 2010-07-22T17:50:27.140 に答える