These search terms have been highlighted:[trick]
2010-05-13
クラスや構造体のメンバ変数を初期化するには,コンストラクタに初期化リストを書かなければならない.が,宣言場所と離れてしまったり,同じ変数名を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 など以外は使えない(整数リテラルしか,テンプレート型引数に使えない).