@rodrigoの回答に加えて(彼は速かった…)、
静的アサートはいつ実行されますか? テンプレートのどこにでも配置できますか? テンプレートのインスタンス化ごとに評価されますか? テンプレート パラメータをクラスの特定のサブタイプに制限するために使用できますか?
残念だけど違う。たとえば、 astatic_assert(false, "bummer");
はテンプレートに関係なく常に実行されます。テンプレートを (部分的に) 特化したい場合、これは特に失敗します。
標準(§7.4)は次のように述べています。
[条件が次の場合static_assert
]false
プログラムの形式が正しくなく、結果の診断メッセージ (1.4) には、文字列リテラルのテキスト […] が含まれます。
残念ながら、これは非常に不明確ですが、この特異性の欠如は、実際static_assert
、テンプレートの種類に依存しない場合の動作とまったく同じです。
static_assert
その実行を特定のテンプレート引数にバインドするには、条件をテンプレート引数に依存させる必要があります。
したがって、次の場合は失敗します。
template <typename T>
struct some_type {
static_assert(false, "T must be a pointer type");
};
template <typename T>
struct some_type<T*> {
// …
};
最後に、このプロセスをさらに詳しく説明し、多くのトレイト関連の問題をエレガントに解決する方法についてのヒントを提供する、More type traitsに関する Marthino の記事を読むことを心からお勧めします。