На этом шаге мы рассмотрим использование функции make_pair.
Шаблонная функция make_pair() позволяет создать пару значений без явного указания типов:
namespace std { // Создание обьекта пары только по значениям template <class T1, class T2> pair<T1, T2> make_pair(const T1& x, const T2& y) { return pair<T1,T2>(x, y); } }
Например, благодаря функции make_pair следующие строки эквивалентны:
std::make_pair(42,'@') std::pair<int,char>(42,'@')
В частности, функция make_pair позволяет легко передать два значения, образующие пару, функции с аргументом типа pair. Рассмотрим следующий пример:
void f(std::pair<int,const char*>); void g(std::pair<const int,std::string>); . . . . void foo { f(std::make_pair(42,"hello")); // Два значения передаются в виде пары g(std::make_pair(42,"hello")); // Два значения передаются в виде пары // с преобразованием типа. }
Как видно из приведенного примера, функция make_pair() упрощает передачу двух значений в одном аргументе. Она работает даже при неполном соответствии типов, поскольку шаблонный конструктор обеспечивает автоматическое преобразование. Такая возможность особенно часто используется при работе с отображениями и мультиотображениями.
Впрочем, у выражений с явным указанием типов есть свое преимущество - они четко определяют тип полученной пары. Например, следующие два выражения дают разные результаты:
std::pair<int,float>(42,7.77) std::make_pair(42,7.77)
Во втором случае создается объект pair, у которого второй компонент относится к типу double (вещественные литералы с неуточненным типом интерпретируются как double). Тип может оказаться существенным при использовании перегруженных функций или шаблонов, в которых, например, для повышения эффективности могут быть предусмотрены разные версии для float и double.
На следующем шаге мы начнем знакомиться с классом auto_ptr.