2007年09月07日

boost::arrayの初期化

Boost C++Librariesプログラミング 第2版を読んで気が付いたのですが、 boost::arrayクラスのオブジェクトは不思議な方法で初期化できます。

こんな方法です。

boost::array<int, 5> a = {0, 1, 2, 3, 4};

どんなコンストラクタを書けばこのように初期化できるようになるのかさっぱり分からなかったので、調べてみました。

結論。
boost::arrayにコンストラクタはありませんでした。デストラクタもありません。 仮想関数も無く、全てのメンバがpublicです。
どうやら、POD(Plain Old Data)型になる条件が満たされているようです。 つまりboost::array<int, 5>は、C言語互換の構造体なのです。

C言語時代、構造体は次のような方法で初期化できました。

struct foo {
  int elem[5];
};

struct foo a = {0, 1, 2, 3, 4};

C++でも、C言語互換の構造体は同じ方法で初期化できます。 だから、boost::array<int, 5>の初期化は上記のようにできたのです。

古きC言語の構造体規則と新しきC++のテンプレート規則の見事な融合を見た気がしました。

(2007/09/13追記)
正確には、「集成体型」であれば上記のように初期化できるようです。POD型よりも若干条件が緩いようです)

投稿者 MASATO : 2007年09月07日 00:22 | トラックバック
コメント

boost::arrayと同じようなのを作ってみました。(URL参照)

Posted by: アキラ : 2007年09月12日 23:45
コメントする









名前、アドレスを登録しますか?