Как работает этот рекурсивный шаблон?C++

Программы на C++. Форум разработчиков
Anonymous
Как работает этот рекурсивный шаблон?

Сообщение Anonymous »

Я читаю книгу «Шаблоны C++. Полное руководство», и в главе «Списки типов» упоминается некоторый код, который я не могу полностью понять, пока он расширяется в их рекурсивном вызове.
При использовании First = Front; код назначает тип фасада в списке типов. Но при использовании Rest = typename LargestTypeT
>::Type; сначала удаляется передний тип, а затем рекурсивно вводится шаблон, передавая список типов без переднего типа.
После этого строка с использованием Type = IfThenElse= sizeof(Rest)), First, Rest>; сравнивается, больше ли First или равно Rest который, насколько я понимаю, представляет собой список типов.
Эту часть я не до конца понимаю. Итак, как можно сравнить тип со списком типов, содержащим один или несколько элементов?
В частности, до чего расширяется Rest по сравнению с First в этой строке?
template
class Typelist
{
};

template
class LargestTypeT;
// recursive case:
template
class LargestTypeT
{
private:
using First = Front;
using Rest = typename LargestTypeT
>::Type; // This must expand as Typelist
public:
//
// -> Doesn't know in what the below expands to.
// -> The `Rest` is currently expanded as `Typelist` but how can be
// -> compared with the current type `First`?
using Type = IfThenElse= sizeof(Rest)), First, Rest>;
};
// basis case:
template
class LargestTypeT
{
public:
using Type = char; // This type is as comparation against
// the others just as the smallest type
};
template
using LargestType = typename LargestTypeT::Type;

Учитывая следующий список типов:
Typelist

LargestType вернет первый, самый большой тип в списке типов. Это может быть int или long.
Вот код для получения первого типа в списке, а также для удаления первого элемента из списка. У меня нет проблем с пониманием всего кода ниже.
template
class FrontT;
template
class FrontT
{
public:
using Type = Head;
};
template
using Front = typename FrontT::Type;

template
class PopFrontT;
template
class PopFrontT {
public:
using Type = Typelist;
};
template
using PopFront = typename PopFrontT::Type;


Подробнее здесь: https://stackoverflow.com/questions/790 ... late-works

Вернуться в «C++»