我在可变参数模板上阅读此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;
非常感谢。
答案 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!
};