2011-01-10 16 views
0

私はC++用の単純なコンテナクラスを開発しており、配列から値をコピーできると便利だと分かりました。配列から構築

myClass myInstance; 
myInstance += 2; 
myInstance += 4; 
myInstance += 8; 
myInstance += 16; 

そして、この:

それはこの違いだ

明らか
myClass myInstance; 
int myArray[] = {2, 4, 8, 16}; 
myInstance = myArray; 

、配列構造は、多くのクリーナーです。しかし、関数に渡される配列のサイズ(この場合はoperator=)を得ることができないので、値をコピーすることが重要です。

私は配列と一緒にパラメータとしてサイズを渡すこともできますが、それは私がoperator=使用することはできません意味:

myInstance.getArrayValues(myArray, 4); 

がずっと少ない直感的方法

myInstance = myArray; 

よりですこのようなことは通常処理されますか?

+0

好奇心の外に、あなたはどんな種類の容器を書いていますか? – AraK

+0

@AraK学習目的のための単純なテンプレートクラスです。 – Maxpm

答えて

6

実際、参照によってネイティブ配列を受け入れることができます。ここで何をしたいん代入演算子の一例である:

template <std::size_t N> 
const myClass& operator=(const int(&arr)[N]) 
{ 
    // use arr as you do usually with arrays :) 
    // N is the size of the array. 
    return *this; 
} 
1

イテレータを使用することをお勧めします。すなわち、イテレータを使用することです。すなわち、最初と最後のイテレータを取り込むテンプレート関数を与えます。もちろん、ポインタも使用できます。

利点は、任意のコンテナから入力を取得できることです。

コンパイラでC++ 0xのサポートを待つことができ、正しく覚えていれば、配列のような初期化リストを使って構築できる新しい機能を利用することができます。それまでは、イテレーターを使うのが私の考え方です。

0

標準はstd::vectorテンプレートクラスでそれを処理する(そしてTR1サイズ/容量を変更しないCスタイルアレイのstd::arrayクラスを有します)。

std::vectorは、挿入と割り当ての機能を使用して、何度も(オーバーロードなしで)operator=を実行します。

1

Boost.Assignmentライブラリは、この問題に取り組むために設計されました。