次の点を考慮してください。
struct A {
typedef int foo;
};
struct B {};
template<class T, bool has_foo = /* ??? */>
struct C {};
typename T::foo の有無に基づいて、C<A> が 1 つの特殊化を取得し、C<B> が別の特殊化を取得するように、C を特殊化したいと考えています。これは、型特性またはその他のテンプレート マジックを使用して可能ですか?
問題は、 B::foo が存在しないため、 C<B> をインスタンス化するときに、私が試したすべての方法でコンパイル エラーが発生することです。しかし、それは私がテストしたいものです!
編集:ildjarnの答えの方が良いと思いますが、最終的に次のC++ 11ソリューションを思いつきました。男はハッキーですが、少なくとも短いです。:)
template<class T>
constexpr typename T::foo* has_foo(T*) {
return (typename T::foo*) 1;
}
constexpr bool has_foo(...) {
return false;
}
template<class T, bool has_foo = (bool) has_foo((T*)0)>