Вспомогательные средства. Вспомогательная функция 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий