C++0xでは、ユーザー定義クラスで配列のような初期化ができるようになります
vector<int> v = {3, 1, 4};
Bjarne氏曰く「なんで今までできなかったのかわからない」
戻り値に初期化子リスト
vector<int> create_vector() { return {3, 1, 4}; }
引数に初期化子リスト
void something(const vector<int>& v) { ... } something( {3, 1, 4} );
mapの要素
map<string, int> dict = { {"Akira", 22}, {"Johnny", 38}, {"Millia", 16} };
初期化子リストをユーザー定義クラスで使用するには
std::initializer_listを受け取るコンストラクタ(や代入演算子)を用意します。
template <class T> class vector { public: vector(std::initializer_list<T>); };
initializer_listは以下のように定義されています
template <class T> class initializer_list { public: size_t size() const; const T* begin() const; const T* end() const; };
ちなみに現在のC++の仕様でも、boost::arrayのようなクラスでは上記のような初期化ができます
template <class T, size_t N> struct array { // publicなメンバ T element_[N]; // ※デフォルトコンストラクタをあえて作らない };
array<int, 3> ar = { 3, 1, 4};
また、initializer_listにともなう言語拡張 Uniform initialization によって
配列メンバ変数を初期化子リストで初期化できるようになります。
class hoge { int ar_[3]; public: hoge() : ar_{3, 1, 4} { } };