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

Числовые метафункции

Описание:

Числовая метафункция является тэг диспетчеризированной метафункцией, что обеспечивает инфраструктуру для легкой реализации операци смешанного типа.

Требования к выражениям:

В следующей таблице и спецификациях, op - заполнительный маркер для текущей числовой метафункции, а х, у и x1, x2, ... хn - произвольные числовые типы.

Выражение

Тип

Сложность

op_tag<x>::type

Интегральная константа

Амортизированное постоянное время.

op_impl<

op_tag<x>::type,

op_tag<y>::type

>::apply<x,y>::type

Любой тип

Не определено.

op<x1,x2,... xn>::type

Любой тип

Не определено.

Семантика выражений:

typedef op_tag<x>::type tag;

Семантика: tag – тип тэга для x и op, tag::value – ранг преобразования x.

typedef op_impl<

op_tag<x>::type,

op_tag<y>::type

>::apply<x,y>::type r;

Семантика: r – результат работы op, с аргументами x и y.

typedef op<x1,x2,... xn>::type r;

Семантика: r – результат работы op, с аргументами x1, x2,…, xn.

Пример:

struct my_complex_tag : mpl::int_<10> {};

template< typename Re, typename Im > struct my_complex

{

typedef my_complex_tag tag;

typedef my_complex type;

typedef Re real;

typedef Im imag;

};

template< typename T > struct my_real : T::real {};

template< typename T > struct my_imag : T::imag {};

namespace boost { namespace mpl {

template<>

struct plus_impl< my_complex_tag, my_complex_tag >

{

template< typename N1, typename N2 >

struct apply : my_complex<

plus< typename N1::real, typename N2::real >,

plus< typename N1::imag, typename N2::imag >

>

{};

};

}}

int main()

{

typedef my_complex< mpl::int_<5>, mpl::int_<-1> > c1;

typedef my_complex< mpl::int_<-5>, mpl::int_<1> > c2;

typedef mpl::plus<c1,c2> r1;

BOOST_MPL_ASSERT_RELATION( my_real<r1>::value, ==, 0 );

BOOST_MPL_ASSERT_RELATION( my_imag<r1>::value, ==, 0 );

typedef mpl::plus<c1,c1> r2;

BOOST_MPL_ASSERT_RELATION( my_real<r2>::value, ==, 10 );

BOOST_MPL_ASSERT_RELATION( my_imag<r2>::value, ==, -2 );

typedef mpl::plus<c2,c2> r3;

BOOST_MPL_ASSERT_RELATION( my_real<r3>::value, ==, -10 );

BOOST_MPL_ASSERT_RELATION( my_imag<r3>::value, ==, 2 );

return 0;

}

Модели:

  • plus

  • minus

  • times

  • divides

Смотри также:

Tag Dispatched Metafunction, Metafunctions, numeric_cast

Тривиальные метафункции

Описание:

Тривиальные метафункции принимают один аргумент классового типа х и возвращают вложенный в х элемент x::name, где name - маркер заполнитель для текущего имени элемента доступного определенному экземпляру метафункции.

По соглашению, все тривиальное метафункции в MPL именуются после соответствующих элементов, доступ к которым они предоставляют. Например, доступ к тривиальной метафункции first класса x, выглядит как x::first.

Требования к выражениям:

В следующей таблице и спецификациях, name - заполнительный маркер для имен тривиальной метафункции и доступного элемента, х - классовый тип такой, что х::name – действительное имя типа.

Выражение

Тип

Сложность

name<x>::type

Любой тип

Постоянное время.

Семантика выражений:

typedef name<x>::type r;

Предусловие: x::name – действительное имя типа.

Семантика:

is_same<r,x::name>::value == true.

Модели:

  • first

  • second

  • base

Смотри также:

Metafunctions, Trivial Metafunctions, identity

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