我有几个类。现在它们被一个符号隔开。它们中很少含有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'
一种方法是使用基本的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;
};
演示。
Question:我的代码中有很多这样的实例,我觉得这个方法可能会大大增加编译时间。因为必须经过两次迭代:第一次查找type
,第二次解析bool
标志。
是否有更快的方法来实现减少编译时间?
[旁注:在这种情况下,我把type
作为A
和B
之间的分隔符。然而,我可以自由地把任何东西放在A
里面,这将把它与B
分开。[/p>
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;
};