boost::arrayの初期化

boostのarrayを使う際に初期化で少し躓いたのでメモ.

boost::array<double, 3> a = {{0.0, 0.0, 0.0}}; // 正しい
boost::array<double, 3> a({{0.0, 0.0, 0.0}}); // エラー

これだとメンバ変数の初期化で困る. これを解決するには自分で以下のような関数を用意しておく必要があるそうな.

template <typename T_>
inline boost::array<T_, 3> make_array3(const T_& v1, const T_& v2, const T_& v3)
{
  boost::array<T_, 3> a = {v1, v2, v3};
  return a;
}

任意の長さのarrayを作れるようにしたいところですが, 僕の場合はこれで十分でした.

注意すべき点は以下のようなケースです.

void func(const boost::array<double, 3>& a)
{
  ; // ....
}

int main(void)
{
  func(make_array3<double>(0, 1, 2)); // 正しい
  func(make_array3(0, 1, 2)); // エラー
}

下記の書き込みを参考にしました.

http://lists.boost.org/Archives/boost/2006/08/109003.php
http://d.hatena.ne.jp/mb2sync/20070318