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

Chapter 39. Boost.Typeof

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Part I. The Boost C++ Libraries (BoostBook Subset)

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

PrevUpHomeNext

Chapter 39. Boost.Typeof

Arkadiy Vertleyb

Peder Holt

Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файл LICENSE_1_0.txt или копию по адресуhttp://www.boost.org/LICENSE_1_0.txt)

Motivation

Сегодня многие библиотеки шаблонов предоставляют генераторы объектов для упрощения создания объектов с помощью средства вычисления аргументов шаблона C++. рассмотреть<std::pair>. Для того, чтобы инстанцировать этот шаблон класса и создать временный объект этой инстанциации, необходимо предоставить конструктору параметры шаблона, а также параметры:

std::pair<int, double>(5, 3.14159);

Чтобы избежать этого дублирования, STL поставляет генератор объектов<std::make_pair>. При его использовании типы параметров шаблона выводятся из приведенных аргументов функции:

std::make_pair(5, 3.14159);

Для временных объектов этого достаточно. Однако при выделении именованного объекта проблема появляется вновь:

std::pair<int, double> p(5, 3.14159);

Генератор объектов больше не помогает:

std::pair<int, double> p = std::make_pair(5, 3.14159);

Неплохо было бы вывести тип объекта (слева) из выражения, с которым он инициализируется (справа), но текущий синтаксис C++ этого не допускает.

Приведенный выше пример демонстрирует суть проблемы, но не демонстрирует ее масштаб. Многие библиотеки, особенно библиотеки шаблонов выражений, создают объекты действительно сложных типов и идут долгий путь, чтобы скрыть эту сложность за генераторами объектов. Считай, что это круто. Lambda functor:

_1 > 15 && _2 < 20

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

lambda_functor<
    lambda_functor_base<
        logical_action<and_action>,
        tuple<
            lambda_functor<
                lambda_functor_base<
                    relational_action<greater_action>,
                    tuple<
                        lambda_functor<placeholder<1> >,
                        int const
                    >
                >
            >,
            lambda_functor<
                lambda_functor_base<
                    relational_action<less_action>,
                    tuple<
                        lambda_functor<placeholder<2> >,
                        int const
                    >
                >
            >
        >
    >
>
f = _1 > 15 && _2 < 20;

Не совсем элегантно. Для решения этой проблемы (а также некоторых других проблем) комитет по стандартизации C++ рассматривает несколько дополнений к стандартному языку, например<typeof/decltype>и<auto>(см.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1607.pdf).

Оператор<typeof>(или<decltype>, который имеет несколько иной вкус<typeof>) позволяет определить тип выражения во время компиляции. Используя<typeof>, приведенный выше пример можно значительно упростить:

typeof(_1 > 15 && _2 < 20) f = _1 > 15 && _2 < 20;

Гораздо лучше, но до сих пор существует некоторое дублирование. Тип<auto>решает остальную проблему:

auto f = _1 > 15 && _2 < 20;

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


PrevUpHomeNext

Статья Chapter 39. Boost.Typeof раздела The Boost C++ Libraries BoostBook Documentation Subset Part I. The Boost C++ Libraries (BoostBook Subset) может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Part I. The Boost C++ Libraries (BoostBook Subset) ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:23:40/0.0067760944366455/0