4

私はいくつかのクラスを持っています。今のところ、それらは 1 つの記号で区切られています。type(a ) を含むものはほとんどなく、含まtypedefないものもほとんどありません。

struct A { ... public: typedef someclass type; }
struct B { ... };

次のような方法でSFINAEクラスを実装したいと思います。

Resolve<A>::type o1;  // should resolve to 'A::type'
Resolve<B>::type o2;  // should resolve to 'B'

1 つの方法は、前のリンクに示されているように基本的な SFINAE を使用して、Tに a が含まれているかどうかをチェックしてからチェッカーtypeを使用することです。bool例えば、

template <typename T>
struct has_type {
  typedef char yes[3];
  template <typename C> static yes& test(typename C::type*);
  template <typename> static char& test(...);
  static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};

template<typename TYPE, bool = has_type<TYPE>::value>
struct Contains { typedef typename TYPE::type type; };
template<typename TYPE>
struct Contains<TYPE, false> { typedef TYPE type; };

template<class TYPE>
struct Resolve {
  typedef typename Contains<TYPE>::type type;
};

デモ

質問: コード全体にそのようなインスタンスが多数ありますが、この方法ではコンパイル時間が大幅に長くなる可能性があると感じています。1 回目はフラグを見つけtype、2 回目はフラグを解決しboolます。

コンパイル時間を短縮するためのより速い方法はありますか?

[補足: この場合、 との間にtype区切り文字を入れました。ただし、から分離するものは自由に中に入れることができます。それにまつわるアイデアも大歓迎です。】ABAB

4

1 に答える 1

3
template<typename>
struct void_ {
    typedef void type;
};

template<typename T, typename = void>
struct Resolve {
    typedef T type;
};

template<typename T>
struct Resolve <T, typename void_<typename T::type>::type> {
    typedef typename T::type type;
};
于 2011-10-06T06:34:28.177 に答える