2011-10-28 4 views
5

boost::array(またはtr1またはstdバージョン)は、ビルトイン配列に比べて優れた追加機能を提供します。今まで組み込みの配列をstd/tr1/boost ::配列に置き換えるのはいつでも安全ですか?

、私たちのコードベースは唯一、組み込み配列を含んで、たとえばため(アップ作ったが、スタイルが一致する):

WORD m_lastReadFlags[FLAGS_MAX]; 
... 
WORD flagBuffer[FLAGS_MAX]; 
if (getFlags(flagBuffer)) { 
    memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags)); 
    ... 

私はone'llアイデアを得ると思います。

さて、私の質問は、コード内でそれらの場所のために、どこboost::arrayにドロップするとarray 100%のセマンティクスは、アレイに組み込まれたためにドロップイン保存され、(なぜなら作らその他の変更の)意味をなさないと思いますか?

boost::array<WORD, FLAGS_MAX> m_lastReadFlags; 

と:使用する(たとえば)は、上記のコード書き換えることができ、ある

- (のみサイレント行動の変化は、私を悩ませているものです可能性のあるコンパイルエラーOKです。) memcpy(場合によってはc_array()またはdata()を使用するように適合されています)、他の配列のようなアクセスは同じままですか? もちろん、ローカルバッファを配列で置き換えてmemcpyを削除したり、std::copyなどを使用したりすることもできますが、この問題のポイントは組み込み配列と配列クラスの互換性に関することです。


更新:特に私を悩まことの一つは、組み込み配列をポインタとして使用されている(memcpy場合のように)な場所です。すべての発生は、 コンパイラによって捕捉されるか、正しく処理されますか?

割り当てについてはどうですか?

T arr1[N]; // or array<T, N> 
T arr2[N]; // or array<T, N> 
T* p1; 
... 
// Note, not all combinations will compile: 
arr1 = arr2; 
p1 = arr1; 
arr2 = p1; 
... 

答えて

5

arrayクラスが正確に自動配列のラッパーであるのではい、それは、微細であるべきです。角括弧で囲まれた同じアクセス構文があり、ポインタを取得する必要がある場合は、その方法を知っています。どこでもstd::copyを使用してイテレータを使用することもできます。とにかくmemcpyによって実装される可能性があります。

arrayクラスは集合型(ノー非自明なコンストラクタ/デストラクタ/割り当て)であるので、あなたは単なる配列のように、伝統的な集計(ブレース)初期化子で初期化することができます。

関連する問題