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

Functions with Multiple Arguments

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

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

Операции могут иметь более одного аргумента любые . В качестве примера рассмотрим бинарное сложение.

typedef any<
    mpl::vector<
        copy_constructible<>,
        typeid_<>,
        addable<>,
        ostreamable<>
    >
> any_type;
any_type x(10);
any_type y(7);
any_type z(x + y);
std::cout << z << std::endl; // prints 17

Это не мультиметод. Основные типы аргументов + должны быть одинаковыми или поведение не определено. Этот пример является правильным, поскольку оба аргумента содержат int.

[Note]Note

Добавление relaxed приводит к исключению, а не к неопределенному поведению, если типы аргументов неверны.

addable<> требует, чтобы типы аргументов были точно такими же. Однако это не распространяется на все виды использования добавок. Например, арифметика указателей берет указатель и целое число и возвращает указатель. Мы можем фиксировать такого рода отношения между несколькими типами, идентифицируя каждый тип, связанный с заполнителем. Мы позволим заполнителю _a представлять указатель, а заполнителю _b представлять целое число.

int array[5];
typedef mpl::vector<
    copy_constructible<_a>,
    copy_constructible<_b>,
    typeid_<_a>,
    addable<_a, _b, _a>
> requirements;

Наша новая концепция добавляемый<_a, _b, _a> содержит правила добавления указателей: _a -> _a.

Кроме того, мы больше не можем самостоятельно фиксировать переменные.

any<requirements, _a> ptr(&array[0]); // illegal

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

typedef mpl::map<mpl::pair<_a, int*>, mpl::pair<_b, int> > types;
any<requirements, _a> ptr(&array[0], make_binding<types>());
any<requirements, _b> idx(2, make_binding<types>());
any<requirements, _a> x(ptr + idx);
// x now holds array + 2

_b карты к int. .

Мы также можем использовать tuple, чтобы избежать необходимости явного написания карты. tuple - это просто класс удобства, который сочетает в себе привязки заполнителя, которые он получает из всех своих аргументов.

tuple<requirements, _a, _b> t(&array[0], 2);
any<requirements, _a> y(get<0>(t) + get<1>(t));


PrevUpHomeNext

Статья Functions with Multiple Arguments раздела 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 17:02:52/0.0066878795623779/0