9

前の質問では、static_assertを使用して、テンプレートパラメーターを特定のサブタイプに制限したいと思いました。質問に答えました。アーカイブのコードは次のとおりです。

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

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

これは標準ライブラリでどういうわけか達成可能ですか?

2つの課題があります。

  • boost::mplを使用せずにコンパイル時に文字列をアセンブルする
  • Tがインスタンス化されたタイプの名前を取得します。名前は意味のあるものでなければならず、理想的には違反している定義で使用されているものと同じである必要があります。typeid(T).name()を試しましたが、受け入れられないマングル名しか返されません。何かの名前を返すマクロがあったことを覚えていますが、それはもう思い出せません。
4

2 に答える 2

8

これはできません。static_assert文字列リテラルが必要です。文字列リテラルのセマンティックアイデンティティTを組み立てる方法はありません。Y

コンパイラーがテンプレートインスタンス化スタックの読みやすいバックトレースを提供し、それを囲むクラステンプレートインスタンス化の値Tとテンプレートパラメーターを提供することを期待できます。Y

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

于 2012-06-15T12:23:16.277 に答える
2

引き続きBOOST_MPL_ASSERT_MSGを使用できます 。ジェネリック型をパラメーターとして受け入れ、具体的な型名をエラーメッセージに含めようとします。

詳細と例はこちら: http ://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/refmanual/assert-msg.html

于 2012-06-16T09:50:50.547 に答える