任意に整数変数を初期化するテンプレートクラス

クラスや構造体のメンバ変数を初期化するには,コンストラクタに初期化リストを書かなければならない.が,宣言場所と離れてしまったり,同じ変数名を2度(宣言と初期化で)書く必要があって面倒くさかったりする.整数変数しか使えないが,メンバ変数を宣言位置で初期化できる方法を紹介する.

具体的には,整数リテラルをテンプレート引数に持つテンプレートクラスを作る.で,キャストとかを適当にオーバーロードしておけばできあがり.

template <typename t_type, t_type init_value=0>
struct IntInitializer
{
  t_type Entity;
  operator t_type& ()  {return Entity;}  // オリジナルの型にキャスト
  operator const t_type& () const {return Entity;}  // オリジナルのconst型にキャスト
  IntInitializer(void) : Entity(init_value) {}
  IntInitializer(const t_type &i) : Entity(i) {}
};

使い方:

IntInitializer<int,3>  x;  // x は3に初期化される
cout<<x+10<<endl;  // 13
++x;  // operator++(int &) が実行される
typedef IntInitializer<int,10> int10;
int10 y,z;  // いずれも10に初期化される

一応,オリジナルの型で初期化できるようにしてある:

IntInitializer<int,3>  x(10);  // x は10に初期化される

3より10が優先されるのは,コンストラクタ IntInitializer(const t_type &i) が呼ばれるからだ.が,紛らわしいのであまり使わない方がよいだろう.

難点は,整数型しか使えないこと.int, bool, char など以外は使えない(整数リテラルしか,テンプレート型引数に使えない).