Подтвердить что ты не робот

С++ Template Metaprogramming - Можно ли выводить сгенерированный код?

Я хотел бы отладить некоторый шаблонный код, чтобы лучше понять его. К сожалению, я новичок в метапрограммировании шаблонов, и мне сложно войти.

Когда я пытаюсь вывести предварительно обработанные исходные файлы, я получаю 125 000 строк кода:/

Итак, есть ли способ увидеть сгенерированный код? (Библиотека, которую я использую, SeqAn)

4b9b3361

Ответ 1

Нет, это не так. Препроцессор не имеет никакого отношения к обработке шаблонов, которая выполняется компилятором. Шаблоны не генерируют код С++, не более, чем вызов функции - они являются неотъемлемой частью самого языка С++.

Ответ 2

Нет, в общем, это невозможно. Шаблоны - это просто часть языка С++, они не являются отдельным препроцессором, поэтому они не генерируют код на С++.

Обычное решение заключается в том, чтобы посыпать ваш код статическими утверждениями и другими тестами, чтобы убедиться, что правильные шаблоны создаются в правильном порядке.

Как только вы начинаете заблуждаться в метапрограммировании, этот простой трюк может помочь вам определить, какой тип параметра шаблона действительно:

// given a variable t of an unknown type T
int*** i = t;

Когда компилятор столкнется с этим, он распечатает приятное и простое сообщение об ошибке "Невозможно преобразовать <long, detailed typename> в int ***", что позволит вам легко убедиться, что параметр шаблона T на самом деле является типом, который вы подумайте, что это должно быть.

Ответ 3

Отметьте мою публикацию по отладке метапрограмм шаблона С++

На странице 6 вы можете увидеть, как это работает. Для конкретных целей вам не понадобится целая инструментальная цепочка, это можно сделать вручную.

Я собрал надстройку Visual С++, где вы могли бы разместить точки останова и т.д., но это было скорее доказательством концепции, чем инструментом для ежедневного использования.

Мы работаем над графическим интерфейсом, который показывает все экземпляры, позволяет отлаживать, профилировать. К сожалению, мы не можем обещать дату публикации этого инструмента, поскольку мы делаем это в наше довольно ограниченное свободное время.

UPDATE: отладчик и профайлер доступны здесь

UPDATE: С++ Теперь презентация

Ответ 4

Это потенциально ответ на ваш вопрос:

Инструмент препроцессора шаблона С++

Кажется, удовлетворил последнего человека, который спросил - хотя я не могу себе представить, почему! Вывод компилятора С++ в C обычно довольно нечитабелен, поскольку он не предназначен для понимания, а просто для портативного языка ассемблера.

Ответ 5

в общем случае невозможно вывести весь код. Но то, что я нашел чрезвычайно интересным, - это возможность использовать отладчик 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 и завершается нулевым типом.

Это очень помогло мне. Иногда вам нужно скопировать действительно грязный тип в текстовый редактор и форматировать его в читаемую форму, но это дает вам возможность отслеживать, что внутри и как оно рассчитывается.

Надеюсь, что поможет,
Ованес