boost::base_from_member

トップページ > 小道具 >

abstract

必要なヘッダ
<boost/utility.hpp>
出来ること
基底クラスより先にメンバ変数を初期化
リファレンス
en

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <boost/utility.hpp>
using namespace std;

class Base
{
protected:
	Base( int id ) { cout << id << " created." << endl; }
};

class Derived
  : private boost::base_from_member<int>
  ,  public Base
{
	typedef boost::base_from_member<int> id;

public:
	// 基底クラスBaseよりも先にID番号を初期化
	Derived() : id( 178 ), Base( id::member ) {}
};

int main()
{
	Derived d;

	// あんまりいい例じゃないなぁ...

	return 0;
}

出力例

178 created.

etc

C++の規格では、クラスのコンストラクタでは、 「まず基底クラスのコンストラクタを呼んで」次に 「自分のメンバ変数を初期化」することになっています。ですがこのため、 ごく希に基底クラスより先にメンバを作成し終えたかったりして困ることになります。 そこで、擬似的にメンバ変数を先に初期化する技がこれ。

方法としては要するに、 メンバ変数を別のクラスに追い出してそこから派生するという形を取ることで、 順番を基底クラス VS 基底クラスの問題にすり替えているわけですね。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0