Шаг 58.
Библиотека STL.
Вспомогательные средства. Вспомогательная функция make_pair

    На этом шаге мы рассмотрим использование функции 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() не требует дополнительных затрат при выполнении программы. Компилятор всегда оптимизирует подобные вызовы.

    Например, благодаря функции 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.




Предыдущий шаг Содержание Следующий шаг