前の質問では、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()を試しましたが、受け入れられないマングル名しか返されません。何かの名前を返すマクロがあったことを覚えていますが、それはもう思い出せません。