2016-04-28 3 views
1

Я читал эту tutorial на шаблонах переменным числом, но ниже код:Синтаксис typedef и шаблонов C++?

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; 
}; 

эти определения типов кажется излишним, но он компилирует хорошо. Проблема в том, что я просто не понимаю, почему они такие, и я не нашел учебника, объясняющего этот случай. Может ли кто-нибудь дать какое-то объяснение? Почему название ЬурейеЕ повторяется:

"::container_type container_type;" 

"::type type;" 

Это не может быть просто так:

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

Большое спасибо.

+1

Из-за рекурсии? См. Также обсуждение в [этом вопросе] (http://stackoverflow.com/questions/36913554/c-typedef-and-templates-syntax). –

ответ

1

Пример демонстрирует рекурсивное определение типа в шаблонах. Ключ в том, что рекурсия базовый случай определяется как специализации для индекса = 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 < 2, MyCont> :: container_type расширяется до container_index < 1, MyCont> :: container_type, который, в свою очередь, расширяется до container_index < 0, MyCont> :: container_type, который, наконец, расширяется до MyCont.

+0

Я понимаю это сейчас. Пока класс «C» имеет этот «тип» (например, тип typedef T), произойдет все вычет типа. Эта часть меня сбила с толку. Спасибо, ребята! –

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! 
}; 
+0

Что мне не нравится, так это то, что программист набирает тип, который не существует: typedef typename container_index :: type type; Программист набирает новый тип с именем «type» на основе старого типа с именем «type», который не существует в шаблоне container_index? –

+0

Sergio: специализация struct container_index <0, C> немного дальше в учебнике содержит конкретный тип, который существует, как отправная точка, и все остальное определяется путем изменения этого. – moonshadow

Смежные вопросы