检测类型

时间:2010-10-09 16:22:35

标签: c++ templates

忽略这个问题,在我的代码中发现了一个错误,标记为删除它

这是来自“模板 - 完整指南”ch。 19.2
复合类型是从其他类型构造的类型。简单的复合类型包括普通类型,指针类型,引用类型甚至数组类型。它们由单一基础类型构成。类类型和函数类型也是复合类型,但它们的组成可能涉及多种类型(对于参数或成员)。可以使用部分特化来分类简单的复合类型。我们从traits类的泛型定义开始,描述除类类型和枚举类型之外的复合类型(后者分别处理):

// types/type2.hpp 
template<typename T> 
class CompoundT {           // primary template 
  public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; //This suppose to be different
    typedef T BottomT; //to this! But is typedef'ed in the same way! FFS!
    typedef CompoundT<void> ClassT; 
}; 

成员类型BaseT是模板参数类型T构建的直接类型的同义词。另一方面,BottomT指的是构建T的最终非指针,非指代和非阵列类型。例如,如果T是int * ,那么BaseT将是int ,而BottomT将是int。
那样做了,尝试过,猜猜什么不行。对于int ** BaseT是int **而BottomT是相同的。很明显,这本书中有一个错误。究竟怎么样typedef'ed类型可以不同?对我来说它不能。我想知道应该有什么(在课堂上)。使它成功 谢谢。

1 个答案:

答案 0 :(得分:0)

那么专业化在哪里?是的,如果我理解正确,这是应该为非复合类型实例化的主要模板。当然,单凭这个模板,什么都做不了。另一方面,让我们考虑指针的特化(对于数组等,它是类似的)

template<typename T> 
class CompoundT<T*> {           // specialization for pointers
  public: 
    enum { IsPtrT = 1, IsRefT = 0, IsArrayT = 0, 
           IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT;
    typedef typename CompoundT<BaseT>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; //not sure what this is for
}; 

现在,对于int **,baseT将是int *,BottomT将是int。 HTH