Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
774 Кб
Скачать
☆

Выбор стратегии:

BOOST_MPL_ASSERT_MSG удобны, малы в размерах и очень выразительны, но требуют некоторой осторожности, при работе с неизвестными типами, типами для которых выполняется сведение (преобразование к указателю), типом void, а также, глубоких переопределени типа.

Использование пользовательских предикатов с BOOST_MPL_ASSERT требует отдельного класса, имя которого будет выступать в качетсве сообщения, а тажке контроля над форматированием сообщений.

Тип печати

Иногда полезно намеренно генерировать диагностические сообщения, как в следующем случае:

template <class T> struct incomplete;

Если необходимо определить каким типом является Т, то дл вывода диагностики необходимо инстанцировать неполное объявление:

template <class T>

struct my_metafunction

{

incomplete<T> x; // temporary diagnostic

typedef ... type;

};

Большинство C++ компиляторов отобразяит каким типом будет Т, в момент инстацнирования шаблона. Нюанс: компиляторы, поддерживающие вывод глубоких переопределений типов, произвольно отображают тип Т, в зависимости от того, как он вычисляется.

Техника расстановки « вставок printfs в коде» позволяет видеть отчет в журнале выполнения. Инстанцирование неполного объявления incomplete<T> приводит к более полной останоке построения.

Для создания журнала выполнения во время компиляции, необходим способ создания не ошибочных диагностических сообщений-предупреждений. MPL содержит метавфункцию print, которая настроена для предупреждений на различных популярных компиляторах с их «обычными параметрами».

Например, следующая программа:

template <class T, class U>

struct plus_dbg

{

typedef typename

mpl::print<typename mpl::plus<T,U>::type>::type

type;

};

typedef mpl::fold<

mpl::range_c<int,1,6>,

mpl::int_<0>,

plus_dbg<_1,_2>

>::type sum;

Ососбенность в GCC: использование метафункционального продвижения (пересылки) переадресации слегка нарушает диагностику. Так, при написании:

template <class T, class U>

struct plus_dbg

: mpl::print<typename mpl::plus<T,U>::type>

{};

Диагностика (GCC):

foo.cpp: In instantiation of

'boost::mpl::print<boost::mpl::integral_c<int, 1> >':

...

foo.cpp:72: warning: comparison between signed and unsigned

integer expressions

foo.cpp: In instantiation of

'boost::mpl::print<boost::mpl::integral_c<int, 3> >':

...

foo.cpp:72: warning: comparison between signed and unsigned

integer expressions

foo.cpp: In instantiation of

'boost::mpl::print<boost::mpl::integral_c<int, 6> >':

...

foo.cpp:72: warning: comparison between signed and unsigned

integer expressions

foo.cpp: In instantiation of

'boost::mpl::print<boost::mpl::integral_c<int, 10> >':

...

foo.cpp:72: warning: comparison between signed and unsigned

integer expressions

foo.cpp: In instantiation of

'boost::mpl::print<boost::mpl::integral_c<int, 15> >':

...

foo.cpp:72: warning: comparison between signed and unsigned

integer expressions

Естественно, эти сообщения будут смешанны с метками трассировки компилятора. Это еще одна область, где диагностические инструменты фильтрации могут быть полезны: STLFilt имеет опцию (/ showback:N), которая устраняет следы трассировки, показанные выше. В системе UNIX, инструмент «grep print» может сделать эту работу так же легко.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]