has_type模板为struct type {}返回true;

时间:2014-09-02 14:49:56

标签: c++ templates template-meta-programming typetraits

有多种方法可以实现has_type<T>模板,推断T是否具有嵌套类或名为type的typedef。即

namespace detail {
    template<typename> struct tovoid { typedef void type; };
}

template<typename T, typename = void> struct has_type
    : std::false_type { };
// this one will only be selected if C::type is valid
template<typename C> struct has_type<C, typename detail::tovoid<typename C::type>::type>
    : std::true_type { };

或者

template <typename C> char test_for_type(...) { return '0'; }
template <typename C> double test_for_type(typename C::type const *) { return 0.0; }

template <typename T> struct has_type
{
    static const bool value = sizeof(test_for_type<T>(0)) == sizeof(double);
};

然而,在任何一种情况下,has_type<type>::value对于此类都是true

struct type
{
};

现在上面的type并没有嵌套其中type,但它确实有一个构造函数type::type()

但是那个构造函数应该触发&#39;检查嵌套类型?或者它是编译器错误? (我想认为typename type::type不适用于构造函数和/或你不能指向构造函数的指针,例如第二个测试方法会产生的指针: typename type::type const *

1 个答案:

答案 0 :(得分:5)

类的名称被“注入”到类的范围内,因此type::type实际上是类型的名称,它与::type的类型相同。