[c++] クラスメンバーの有無に基づいたC ++テンプレートの特化?



Answers

このようなものが役に立つかもしれません: has_member

typedef char (&no_tag)[1]; 
typedef char (&yes_tag)[2];

template< typename T > no_tag has_member_foo_helper(...);

template< typename T > yes_tag has_member_foo_helper(int, void (T::*)() = &T::foo);

template< typename T > struct has_member_foo {
    BOOST_STATIC_CONSTANT(bool
        , value = sizeof(has_member_foo_helper<T>(0)) == sizeof(yes_tag)
        ); }; 

template<class T, bool has_foo = has_member_foo<T>::value> 
struct C {};
Question

次の点を考慮してください。

struct A {
  typedef int foo;
};

struct B {};

template<class T, bool has_foo = /* ??? */>
struct C {};

私はtypename T :: fooの有無に基づいて、C <A>が1つの特殊化を取得し、C <B>がもう1つを取得するように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)>



Links