2

static_assertテンプレートと一緒に非常に優れた機能のようです。

しかし、コンパイル時にさまざまなテストを行うための標準ライブラリの関数を見つけるのに苦労しています。

たとえば、型が別の型のサブタイプであるかどうかを確認する関数を探しています。boost::is_base_of仕事はしますが、標準で同等の機能であるため、ブーストに頼る必要はありません。

static_assert基本的に、 C++11 の標準ライブラリで使用でき、含まれている関数のリストの良いソースはありますか?

いつstatic_assert実行されますか?テンプレートのどこにでも配置できますか? テンプレートのインスタンス化ごとに評価されますか? テンプレート パラメータをクラスの特定のサブタイプに制限するために使用できますか?

4

2 に答える 2

8

最終的なC++11 ドラフト、セクション 20.7、特に<type_traits>ヘッダーを見てください。

あなたが求めているのは:std::is_base_of<base, derived>::value;

あなたの質問に関して:static_assertコンパイラが適切と判断した場合はいつでも評価できますが、通常は次のようになります。

  • テンプレート内: 式が従属名を使用している場合は、開始時に。それ以外の場合は、定義時に。
  • テンプレート外: 定義時間内。
于 2012-06-15T10:23:22.343 に答える
5

@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 の記事を読むことを心からお勧めします。

于 2012-06-15T10:25:34.247 に答える