有多种方法可以实现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 *
。
答案 0 :(得分:5)
类的名称被“注入”到类的范围内,因此type::type
实际上是类型的名称,它与::type
的类型相同。