2012年01月16日

Static_Assert

こんにちは。
寒くて布団から出るのがつらい、イワモーです晴れ

あと2か月半程したら、初めての後輩が出来ます。
頼れる先輩になれる様、今以上に頑張っていかないと、と思う今日この頃ですグッド(上向き矢印)

さて、今回はVisualC++2010から追加された機能、
Static_Assertについてお話したいと思いますひらめき

Static_Assertを簡単に説明すると、
「定数にコンパイルの条件を追加する構文」
でしょうか。

VisualC++2010以前の機能では、
例えば定数に2の倍数以外の設定をして欲しくない場合


void Hoge()
{
try
{
if(MULTIPLES_OF_TWO%2 != 0)
{
throw "Surplus check error : MULTIPLES_OF_TWO need the multiple of 2!!";
}
}
catch(std::string errorLog)
{
std::cout << errorLog.c_str() << std::endl;
}
}


この様にゲーム中で動的に定数の条件を判別する必要があります。
実際にプログラムを動作させるまで、MULTIPLES_OF_TWOは2の倍数か判定できません。
更に、2の倍数以外だった場合の例外処理等も必要になってきます。
(もちろん、人間による目視確認は出来ますがふらふら

しかし、VisualC++2010から利用できる「Static_Assert」を利用すると、
ゲームの動作中ではなく、コンパイル時に判定する事が出来ますぴかぴか(新しい)


static const int MULTIPLES_OF_TWO = 1001;

void Hoge()
{
static_assert(MULTIPLES_OF_TWO%2 == 0,
"static assert error :MULTIPLES_OF_TWO need the multiple of 2!!");
//... 以下で適当な処理
}


この場合、そもそもコンパイルエラーが発生し、プログラムを動作させる事が出来ません。

実際にプログラムを動かす必要が無く、2の倍数以外だった時の処理を書かないで済むので、
エラー処理の手間が省けますぴかぴか(新しい)

しかも、static_assertはスコープに関わらずに記述する事が出来ます目


static const int MULTIPLES_OF_TWO = 1001;
//グローバルスコープに記述する事も可能
static_assert(MULTIPLES_OF_TWO%2 == 0,
"static assert error :MULTIPLES_OF_TWO need the multiple of 2!!");

void Hoge()
{
//... MULTIPLES_OF_TWOのエラーはコンパイル時に検出できるので、
//  エラーを気にせずHogeのすべき処理に専念できる
}


この様に非常にすっきりとした、見やすいコードにする事ができます手(グー)

今回は static const int が2の倍数かを検出する例を取りましたが、
コンパイラが事前に判別出来るデータはこれ以外でも自由に利用する事が出来ます。

また、今回はコンパイルすれば、エラーの「出る」コードを.cppデータとして添付しました。

添付したプログラムにはもう一つ、
static_assertとsizeofを利用した簡単な利用例を記述しましたので、
興味がある方はご覧下さい。

main.cpp

※・VisualStudio2010以前ではstatic_assertがサポートされていないので、正常に動作しません。
※・コード中にあるMULTIPLES_OF_TWOを2の倍数にし、
  LargeClass内で定義されているMAX_DUMMY_SIZEを1000以下にするとコンパイルが通ります。

いかがでしたでしょうか?
VisualC++2010では、他にもラムダ式やauto変数、decltype型指定子など、
使い方次第では強力な機能が追加されています。
特にラムダ式とauto変数は、柔軟なプログラムの設計が可能となる機能だと思うので、
まだ触った事の無い方は、是非一度、触れてみてはと思います手(チョキ)

それでは、また手(パー)

posted by 管理人 at 14:36 | プログラミング