Отладка метапрограмм - PullRequest
6 голосов
/ 20 марта 2010

Есть ли способ пошагово проверить, что происходит, скажем, в шаблоне? Я имею в виду, как это создается шаг за шагом и так далее?

В книге, которую я упомянул здесь ,

Я нашел (2 минуты назад) довольно интересный пример того, как двоичный файл может быть реализован как метафункция.

template <unsigned long N>
   struct binary
   {
       static unsigned const value
          = binary<N/10>::value << 1   // prepend higher bits
            | N%10;                    // to lowest bit
   };

   template <>                           // specialization
   struct binary<0>                      // terminates recursion
   {
       static unsigned const value = 0;
   };

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

1 Ответ

0 голосов
/ 20 марта 2010

Лучшее, что я видел до сих пор, это исследовательская работа по Templight , но я не знаю ни одной опубликованной реализации.

Хотя вы можете сильно помочь себе, используя описательную статику(т.е. время компиляции) - см., например, Boosts static assert или MPLs asser .В некоторых случаях это может помочь спровоцировать ошибку компиляции (например, с помощью статических утверждений), чтобы получить трассировку экземпляра шаблона от компилятора.
Также ничто не мешает вам выводить результаты мета-функций во время выполнения для тестирования.

...