#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> &) )
例えばNULLポインタを渡してはいけない関数の場合、
assert( ptr != NULL );
などと書いておくことで、
その条件に関するチェックを行うことが出来ます。この標準の assert
はしかし、実行時の関数であるため、「実際に呼び出される時にしかチェックされない」
という弱点があります。
template
のパラメータに関する条件を記述したい時などは、
コンパイル時に全て定まるのだから、実行時に assert
せずともコンパイル中にできるはず、ということでこのマクロです。