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

Using Any

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 37. Boost.TypeErasure

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

(Источник примеров в этом разделе см. construction.cpp)

Библиотека предоставляет концепцию конструктивного , позволяющую любому захватывать конструкторы. Единый аргумент шаблона должен быть подписью функции. Тип возврата должен быть заполнителем, определяющим тип, который должен быть построен. Аргументы — это аргументы конструктора.

typedef mpl::vector<
    copy_constructible<_a>,
    copy_constructible<_b>,
    copy_constructible<_c>,
    constructible<_a(const _b&, const _c&)>
> construct;
typedef mpl::map<
    mpl::pair<_a, std::vector<double> >,
    mpl::pair<_b, std::size_t>,
    mpl::pair<_c, double>
> types;
any<construct, _b> size(std::size_t(10), make_binding<types>());
any<construct, _c> val(2.5, make_binding<types>());
any<construct, _a> v(size, val);
// v holds std::vector<double>(10, 2.5);

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

typedef mpl::vector<
    copy_constructible<>,
    constructible<_self()>
> construct;
any<construct> x(std::string("Test"));
any<construct> y(binding_of(x)); // y == ""

Этот метод не ограничивается конструктором по умолчанию. Если конструктор принимает аргументы, они могут быть переданы после привязки.

typedef mpl::vector<
    copy_constructible<>,
    constructible<_self(std::size_t, char)>
> construct;
any<construct> x(std::string("Test"));
any<construct> y(binding_of(x), 5, 'A');

(Источник примеров в этом разделе см. convert.cpp)

any может быть преобразован в другой any при условии, что конверсия представляет собой «изгой»

typedef any<
    mpl::vector<
        copy_constructible<>,
        typeid_<>,
        ostreamable<>
    >
> any_printable;
typedef any<
    mpl::vector<
        copy_constructible<>,
        typeid_<>
    >
> common_any;
any_printable x(10);
common_any y(x);

Это преобразование нормально, поскольку требования common_any являются подмножеством требований any_printable. Преобразование в другом направлении является незаконным.

common_any x(10);
any_printable y(x); // error

(Источник примеров в этом разделе см. references.cpp)

Чтобы получить ссылку, мы просто добавляем ссылку на placeholder.

int i;
any<typeid_<>, _self&> x(i);
any_cast<int&>(x) = 5; // now i is 5

[Note]Note

_self по умолчанию placeholder, поэтому проще всего использовать _self&. Вместо этого можно использовать другой placeholder. any<typeid_<>,&> имеет точно такое же поведение.

Ссылки не могут быть восстановлены. Так же, как и встроенная ссылка на C++, после инициализации вы не можете изменить ее, чтобы указать на что-то другое.

int i, j;
any<typeid_<>, _self&> x(i), y(j);
x = y; // error

[Note]Note

i и j. Назначение Это законно, если assignable<> находится в Концепции, но x все равно будет иметь ссылку на i. .

Ссылка может быть связана с другим любой.

typedef mpl::vector<
    copy_constructible<>,
    incrementable<>
> requirements;
any<requirements> x(10);
any<requirements, _self&> y(x);
++y; // x is now 11

Если ссылка используется после того, как основной объект выходит из сферы действия или сбрасывается, поведение не определено.

typedef mpl::vector<
    copy_constructible<>,
    incrementable<>,
    relaxed
> requirements;
any<requirements> x(10);
any<requirements, _self&> y(x);
x = 1.0;
++y; // undefined behavior.

Это применимо только тогда, когда ссылка построена из значения. Если ссылка построена из другой ссылки, новая ссылка не зависит от старой.

any<requirements> x(10);
boost::shared_ptr<any<requirements, _self&> > p(
    new any<requirements, _self&>(x));
any<requirements, _self&> y(*p); // equivalent to y(x);
p.reset();
++y; // okay

Поддерживаются ссылки как на const, так и на non-const.

int i = 0;
any<incrementable<>, _self&> x(i);
any<incrementable<>, const _self&> y(x);

Ссылка на не-const может быть преобразована в ссылку на const, но не наоборот. Естественно, мы не можем применить мутационные операции к ссылке на const.

any<incrementable<>, _self&> z(y); // error
++y; // error

В большинстве случаев использование любого имеет тот же синтаксис, что и использование основного объекта. Однако есть несколько случаев, когда это невозможно осуществить. Ссылка любой является прокси-сервером и не может использоваться в контекстах, где требуется реальная ссылка. В частности, forward_iterator не создает соответствующий ForwardIterator (если значение_type не установлено). Другое различие заключается в том, что все операции, которые не принимают по крайней мере один аргумент любой аргумент , должны быть переданы с информацией типа явно. Статические функции и конструкторы могут попасть в эту категорию. Все это означает, что общие алгоритмы могут не работать при применении к аргументам любым.


PrevUpHomeNext

Статья Using Any раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 37. Boost.TypeErasure может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 37. Boost.TypeErasure ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 16:57:58/0.0074191093444824/0