C ++ typedef和模板语法?

时间:2016-04-28 11:39:24

标签: templates c++11 typedef variadic

我在可变参数模板上阅读此tutorial,但在下面的代码中:

 template<int index, class C>
struct container_index {

  // points to the "next" container type 
  typedef typename container_index<
    index-1,
    typename C::base_container
  >::container_type container_type;

  // points to the next T-type 
  typedef typename container_index<
    index-1,
    typename C::base_container
  >::type type;
};

这些typedef似乎是多余的,但编译得很好。问题很简单,我不明白为什么他们是这样的,我没有找到解释这个案例的教程。有人可以解释一下吗?为什么重复typedef名称:

"::container_type container_type;"

 "::type type;"

它不可能就是这样:

typedef typename container_index<
        index-1,
        typename C::base_container
      >  type;

非常感谢。

2 个答案:

答案 0 :(得分:1)

该示例演示了模板中的递归类型定义。关键是递归基本情况被指定为index = 0的专门化:

template<class C>
struct container_index<0, C> {

    // point to C instead of C::base_container
    typedef C container_type;

    // point to C::type instead of C::base_container::type
    typedef typename C::type type;
};

正是这种基础案例使得类型演绎成为可能。例如,类型container_index&lt; 2,MyCont&gt; :: container_type被扩展为container_index&lt; 1,MyCont&gt; :: container_type,后者又扩展为container_index&lt; 0,MyCont&gt; :: container_type,最终扩展为MyCont。

答案 1 :(得分:0)

typedef为类型指定名称。因此,您需要提供您想要提供的类型和名称。

typedef typename container_index<index-1, typename C::base_container>::type type;

typename container_index<index-1, typename C::base_container>::type是我们描述我们想要命名的类型,而分号之前的最终type是我们想要称之为的名称。

比较

struct Example
{
    typedef Fruit::orange citrus; // declare a type called Example::citrus, which is the same type as Fruit::orange
    typedef Fruit::apple apple; // declare a type called Example::apple, which is the same type as Fruit::apple - the same operation as the line above, and so the same syntax!
};