Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

The MPL Reference Manual: Tag Dispatched Metafunction

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Front Page / Metafunctions / Concepts / Tag Dispatched Metafunction

Tag Dispatched Metafunction

Summary

А.Метафункция с меткойявляетсяМетафункцией, которая использует методотправки метокв своей реализации для создания инфраструктуры для легкого переопределения / расширения поведения метафункции.

Notation

Symbol Legend
Имя Токен-заполнитель для названия конкретной метафункции.
тег-метафункция Токен-заполнитель для имени метафункции тега.
Тег Токен-заполнитель для одного из возможных типов тегов, возвращаемых метафункцией тега.

Synopsis

template< typename Tag > struct name_impl;
template<
      typename X
    [, ...]
    >
struct name
    : name_impl< typename tag-metafunction<X>::type >
        ::template apply<X [, ...]>
{
};
template< typename Tag > struct name_impl
{
    template< typename X [, ...] > struct apply
    {
        // default implementation
    };
};
template<> struct name_impl<tag>
{
    template< typename X [, ...] > struct apply
    {
        // tag-specific implementation
    };
};

Description

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

Хотя этот механизм всегда доступен, он не всегда самый удобный, особенно если желательно специализировать поведение метафункции длясемействародственных типов. Типичным примером этого являются пронумерованные формы классов последовательностей в самом MPL (list0, ...,list50и др.) и классы последовательностей в целом.

Tag Dispatched Metafunctionявляется концептуальным названием для примера инфраструктуры реализации метафункций, используемой библиотекой, чтобы облегчить пользователям и исполнителям переопределение поведения метафункций библиотеки, работающих на семействах конкретных типов.

Инфраструктура построена на вариации техники, обычно известной какдиспетчеризация тегов(отсюда и название концепции), и включает в себя три объекта: саму метафункцию, ассоциированную метафункцию тегови реализацию метафункции в виде шаблонакласса метафункций, параметризированного параметром типатега. Метафункция перенаправляется на шаблон класса реализации, ссылаясь на свою специализацию по типу тега, создаваемому метафункцией тега с параметрами исходной метафункции.

[4]Обычно такая специализация, определяемая пользователем, по-прежнему требуется для сохранения первоначальных инвариантов и требований к сложностиf.

Example

#include <boost/mpl/size.hpp>
namespace user {
struct bitset_tag;
struct bitset0
{
    typedef bitset_tag tag;
    // ...
};
template< typename B0 > struct bitset1
{
    typedef bitset_tag tag;
    // ...
};
template< typename B0, ..., typename Bn > struct bitsetn
{
    typedef bitset_tag tag;
    // ...
};
} // namespace user
namespace boost { namespace mpl {
template<> struct size_impl<user::bitset_tag>
{
    template< typename Bitset > struct apply
    {
        typedef typename Bitset::size type;
    };
};
}}

Статья The MPL Reference Manual: Tag Dispatched Metafunction раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:53:08/0.0086021423339844/1