Ответ 1
Нет, это не так. Препроцессор не имеет никакого отношения к обработке шаблонов, которая выполняется компилятором. Шаблоны не генерируют код С++, не более, чем вызов функции - они являются неотъемлемой частью самого языка С++.
Я хотел бы отладить некоторый шаблонный код, чтобы лучше понять его. К сожалению, я новичок в метапрограммировании шаблонов, и мне сложно войти.
Когда я пытаюсь вывести предварительно обработанные исходные файлы, я получаю 125 000 строк кода:/
Итак, есть ли способ увидеть сгенерированный код? (Библиотека, которую я использую, SeqAn)
Нет, это не так. Препроцессор не имеет никакого отношения к обработке шаблонов, которая выполняется компилятором. Шаблоны не генерируют код С++, не более, чем вызов функции - они являются неотъемлемой частью самого языка С++.
Нет, в общем, это невозможно. Шаблоны - это просто часть языка С++, они не являются отдельным препроцессором, поэтому они не генерируют код на С++.
Обычное решение заключается в том, чтобы посыпать ваш код статическими утверждениями и другими тестами, чтобы убедиться, что правильные шаблоны создаются в правильном порядке.
Как только вы начинаете заблуждаться в метапрограммировании, этот простой трюк может помочь вам определить, какой тип параметра шаблона действительно:
// given a variable t of an unknown type T
int*** i = t;
Когда компилятор столкнется с этим, он распечатает приятное и простое сообщение об ошибке "Невозможно преобразовать <long, detailed typename>
в int ***", что позволит вам легко убедиться, что параметр шаблона T на самом деле является типом, который вы подумайте, что это должно быть.
Отметьте мою публикацию по отладке метапрограмм шаблона С++
На странице 6 вы можете увидеть, как это работает. Для конкретных целей вам не понадобится целая инструментальная цепочка, это можно сделать вручную.
Я собрал надстройку Visual С++, где вы могли бы разместить точки останова и т.д., но это было скорее доказательством концепции, чем инструментом для ежедневного использования.
Мы работаем над графическим интерфейсом, который показывает все экземпляры, позволяет отлаживать, профилировать. К сожалению, мы не можем обещать дату публикации этого инструмента, поскольку мы делаем это в наше довольно ограниченное свободное время.
UPDATE: отладчик и профайлер доступны здесь
UPDATE: С++ Теперь презентация
Это потенциально ответ на ваш вопрос:
Инструмент препроцессора шаблона С++
Кажется, удовлетворил последнего человека, который спросил - хотя я не могу себе представить, почему! Вывод компилятора С++ в C обычно довольно нечитабелен, поскольку он не предназначен для понимания, а просто для портативного языка ассемблера.
в общем случае невозможно вывести весь код. Но то, что я нашел чрезвычайно интересным, - это возможность использовать отладчик Visual С++, чтобы показать вам тип. Возьмите эту простую метапрограмму:
template<class Head, class Tail>
struct type_list
{
typedef Head head;
typedef Tail tail;
};
struct null_type
{};
template<class List>
struct list_head
{
typedef typename List::head head;
};
template<class List>
struct list_tail
{
typedef typename List::tail tail;
};
template<class List>
struct list_length
{
static const size_t length = 1+list_length< typename list_tail<List>::tail >::length;
};
template<>
struct list_length<null_type>
{
static const size_t length = 0;
};
int main()
{
typedef
type_list
< int
, type_list
< double
, type_list
< char
, null_type
>
>
> my_types;
my_types test1;
size_t length=list_length<my_types>::length;
list_head<list_tail<list_tail<my_types>::tail>::tail>::head test2;
}
Я просто создавал мета-типы. Это все еще пустые экземпляры класса С++, длина которых не менее 1 байт. Теперь я могу поставить точку останова после последнего экземпляра test2 и посмотреть, какие типы/значения length, test1 и test2 имеют:
Вот что показывает отладчик:
length 3 unsigned int
test1 {...} type_list<int,type_list<double,type_list<char,null_type> > >
test2 -52 'Ì' char
Теперь вы знаете, что голова вернула вам символ, ваш список содержит int, double, char и завершается нулевым типом.
Это очень помогло мне. Иногда вам нужно скопировать действительно грязный тип в текстовый редактор и форматировать его в читаемую форму, но это дает вам возможность отслеживать, что внутри и как оно рассчитывается.
Надеюсь, что поможет,
Ованес