通常のassertは実行時に変数の妥当性を判断するものである。すなわち動的なデータをチェックする一方で、その関数が呼ばれなければ当然チェックをすることができない。
テンプレート引数が想定されたものであるかや定数が想定されたものであるかをコンパイル時にチェックすることができる。
すなわち、インスタンス化される関数は呼び出しに関わらずチェックされる。
例えば、前者の場合は呼び出しはどこかでされていても、その関数が呼ばれるかどうかは実行中の操作に依存する。そのため、網羅的なテストコードを作成するなどの作業が必要である。
一方、後者ではどこかにその関数の呼び出しがあれば、テンプレートはインスタンス化されるため、その時にstatic_assertによるチェックが行われる。
すなわちプリプロセッサによるチェックよりも動的でありassertによるチェックよりも静的と言える。
例
テンプレート引数が想定されたものであるかや定数が想定されたものであるかをコンパイル時にチェックすることができる。
すなわち、インスタンス化される関数は呼び出しに関わらずチェックされる。
例えば、前者の場合は呼び出しはどこかでされていても、その関数が呼ばれるかどうかは実行中の操作に依存する。そのため、網羅的なテストコードを作成するなどの作業が必要である。
一方、後者ではどこかにその関数の呼び出しがあれば、テンプレートはインスタンス化されるため、その時にstatic_assertによるチェックが行われる。
すなわちプリプロセッサによるチェックよりも動的でありassertによるチェックよりも静的と言える。
例
template<typename T, size_t N> void func( std::array<T, N>& data) { static_assert( N != 16, "data is not matrix array" ); // Nが16でなければ実行中の呼び出し時ではなくコンパイル時にエラーとなる。 assert( N !=16 ); //実行時に判断される。この関数が呼ばれないと機能しない。 }
コメントをかく