|  | 
|      | 
|  | 
| Functions with Multiple ArgumentsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 37. Boost.TypeErasure
  
   | |||||||||
| ![[Note]](/img/note.png) | Note | 
|---|---|
| Добавление  | 
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));
Статья Functions with Multiple Arguments раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 37. Boost.TypeErasure может быть полезна для разработчиков на c++ и boost.
:: Главная :: Chapter 37. Boost.TypeErasure ::
| реклама |