ゼロ初期化クラス(2)
ということで、コンストラクタでゼロに初期化するプログラムを組んでみました。
class Zero{}; class InitZeroMemory{ public: template< class T > InitZeroMemory( T* p ){ memset( p , 0 , sizeof( T ) ); new( p ) T( &zero ); } template< class T , class V1 > InitZeroMemory( T* p , V1 v1 ){ memset( p , 0 , sizeof( T ) ); new( p ) T( &zero , v1 ); } template< class T , class V1 , class V2 > InitZeroMemory( T* p , V1 v1 , V2 v2 ){ memset( p , 0 , sizeof( T ) ); new( p ) T( &zero , v1 , v2 ); } InitZeroMemory( Zero* zero ){} private: InitZeroMemory(); Zero zero; };
何これ(;´Д`)
使い方としては、メンバにInitZeroMemoryを持っておいて、初期化段階でthisを渡します(ぉ
当然警告が出ますが無視w
で、そこから再度別のコンストラクタが呼ばれるので、そこで本当のコンストラクタの処理を行います。
class Hoge{ public: Hoge() : _zero( this ){} Hoge( int n ) : _zero( this , n ){} Hoge( Zero* zero ) : _zero( zero ){} Hoge( Zero* zero , int n ) : _zero( zero ){ _n = n; } int getInt(){ return _n; } private: InitZeroMemory _zero; int _n; }; void main(){ Hoge t1; int a = t1.getInt(); Hoge t2( 5 ); int b = t2.getInt(); }
これで初期化出来たぜウヒャヒャヒャヒャヒャ。
ちなみに今夜中でずっと起きてるから、ちょっと頭がおかしくなってるかもしんないw
つーか、初期化だけのためにこんなに頭を捻ってる時点で自分の頭は逝っちゃってるぜwww
次に起きてこのプログラムを見たときが楽しみだYO!!
……んじゃ、おやすみ。
[追記]
やばい、すんげーアホになってる(;´Д`)
このコード、継承した先でゼロ初期化をしなかった場合、失敗することがある。
継承すると自動的に初期化されるようにしたいんだけど……(~ヘ~;)ウーン
まあ、これはまた気が向いたときに考えるか(;´Д`)