boost::static_assert

トップページ > メタプログラミング >

abstract

必要なヘッダ
<boost/static_assert.hpp>
出来ること
コンパイル時表明
リファレンス
en / jp

sample

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

template<typename T, unsigned int Size>
class MyArray
{
	// サイズは絶対0より大きくなくちゃダメ
	BOOST_STATIC_ASSERT( Size > 0 );

public:
	MyArray()
	  : data( new T[Size] )
	{
	}

	template<typename XT, unsigned int XSize>
	MyArray( const MyArray<XT,XSize>& obj )
	  : data( new T[Size] )
	{
		// コピー先にコピー元が全部収まるべき
		BOOST_STATIC_ASSERT( Size >= XSize );

		// ...ここでコピー処理でも一つ
	}

private:
	T* data;
};

int main()
{
	MyArray<int,0>  x;
	MyArray<int,10> y;
	MyArray<int,5>  z( y );

	return 0;
}

コンパイラの出力例(抜粋)

test.cpp:

エラー E2450 test.cpp 9:
   未定義の構造体 'boost::STATIC_ASSERTION_FAILURE<0>'(関数 main() )
エラー E2109 test.cpp 9:
   許されない型(関数 main() )
エラー E2450 test.cpp 21:
   未定義の構造体 'boost::STATIC_ASSERTION_FAILURE<0>'(関数
       MyArray<int,5>::MyArray(const MyArray<int,10> &) )
エラー E2109 test.cpp 21:
   許されない型(関数 MyArray<int,5>::MyArray(const MyArray<int,10> &) )

etc

例えばNULLポインタを渡してはいけない関数の場合、 assert( ptr != NULL ); などと書いておくことで、 その条件に関するチェックを行うことが出来ます。この標準の assert はしかし、実行時の関数であるため、「実際に呼び出される時にしかチェックされない」 という弱点があります。

template のパラメータに関する条件を記述したい時などは、 コンパイル時に全て定まるのだから、実行時に assert せずともコンパイル中にできるはず、ということでこのマクロです。

see also

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