は、次のことを考えてみましょう:クラスメンバの有無に基づくC++テンプレートの特化?
struct A {
typedef int foo;
};
struct B {};
template<class T, bool has_foo = /* ??? */>
struct C {};
私はC < >一つ専門を取得し、C <B>は、型名Tの有無に基づいて、他を取得します:: fooのように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)>
あなたがC++ 11溶液中で興味を持っていたと述べている必要があります。 :あなたのものは大丈夫ですが、 'bool'を返しSFINAEという式を使うことで' has_foo(T *) 'オーバーロードが改善される可能性があるので、コールサイトでキャストする必要はありません。 – ildjarn
'(T *)0)'は 'declake()'でなければなりません –
Lol4t0