Сегодня многие библиотеки шаблонов предоставляют генераторы объектов для упрощения создания объектов с помощью средства вычисления аргументов шаблона 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;
Цель этого повышения. Тип библиотеки должен обеспечивать библиотечное решение, которое может быть использовано до тех пор, пока языковое средство не будет добавлено в стандарт и не станет широко доступным.