2012-06-15 4 views
8

my previous question static_assertを使用して、テンプレートパラメータを特定のサブタイプに制限したかったのです。質問は次のように答えました:C++ 11 static_assert:パラメータ化されたエラーメッセージ

template <typename T> 
struct X { 
    static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!"); 
}; 

ここで、エラーメッセージをより簡潔にしたいと思います。つまり、どのタイプがこの制約に違反しているのかを述べたいと思います。たとえば、クラスAYから派生しておらず、誰かがX<A>を迎えた場合、エラーメッセージに「タイプパラメータはYから導かれている必要がありますが、Aはありません」というメッセージが表示されます。

これは標準ライブラリでも何とか達成できますか? Tがインスタンス化で使用された型の名前を取得

  • ブースト:: MPLを使用せずに

    • 組み立てた文字列コンパイル時:

      は、私は2つの課題を参照してください。その名前は意味のあるものでなければなりません。理想的には違反の定義に使用されているものと同じです。私はtypeid(T).name()を試しましたが、受け入れられない難解な名前しか返しません。私は何かの名前を返すマクロがあることを覚えていますが、私はもうそれを思い出すことはできません。

  • +1

    関連(perapsもだます):http://stackoverflow.com/q/6415186/34509 –

    答えて

    7

    これはできません。 static_assertは文字列リテラルが必要です。あなたは文字列リテラルに意味的な同一性をTYにまとめる方法がありません。

    コンパイラがテンプレートインスタンシエーションスタックのバックトレースを読みやすく、囲むクラステンプレートインスタンス化のテンプレートパラメータの値がTYになることを期待できます。

    他の人もこれについて考えましたが、たとえばhttp://comments.gmane.org/gmane.comp.compilers.clang.devel/5073を参照してください。

    +0

    常に診断のためとして、それはQOIです。 –

    +0

    なんて恥ずかしい。コンパイル時の定数文字列がなぜ良いのでしょうか?(。 – gexicide

    +0

    @gexicideとにかくコンパイル時の定数文字列を作成するのは通常は実用的ではありません(もちろんリテラル以外にもあります)しかし、時定数や型式が良いでしょう。 – Potatoswatter

    関連する問題