将类型解析为类:: typedef的更短方法

时间:2011-10-06 06:26:50

标签: c++ templates optimization sfinae compilation-time

我有几节课。现在它们被一个符号分开。其中很少包含typetypedef),其中很少人没有。

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'

一种方法是使用上一个链接中显示的基本SFINAE,检查T是否包含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;
};

Demo

问题:我在代码中有很多这样的实例,我觉得这种方法可能会大大增加编译时间。因为必须经历两次迭代:第一次用于查找type,第二次用于解析bool标记。

是否有更快的方式来减少编译时间?

[旁注:在这种情况下,我已将type作为AB之间的分隔符。但是,我可以在A内放置任何内容,将其与B分开。与此相关的想法也是受欢迎的。]

1 个答案:

答案 0 :(得分: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;
};