Использование свободной функции в качестве псевдоконструкторов для использования вывода параметров шаблона - PullRequest
6 голосов
/ 18 марта 2010

Является ли распространенным шаблоном / идиомой использование свободных функций в качестве псевдоконструкторов, чтобы избежать необходимости явно указывать параметры шаблона?

Например, все знают о std::make_pair, который использует его параметры для вывода типов pair:

template <class A, class B>
std::pair<A, B> make_pair(A a, B b)
{
  return std::pair<A, B>(a, b);
}

// This allows you to call make_pair(1, 2),
// instead of having to type pair<int, int>(1, 2)
// as you can't get type deduction from the constructor.

STL также интенсивно использует это в <functional> (bind1st, not1, ptr_fun и т. Д ...)

Я обнаружил, что использую это довольно часто, поэтому мне просто интересно, много ли других людей используют его, и есть ли название для этого шаблона?

1 Ответ

8 голосов
/ 18 марта 2010

Видимо, это называется «Генератор объектов». См. «Больше идиом C ++» и «Повышение» по этой теме.

Лично я нахожу это очень полезным и часто его использую.

Кроме того, я думаю, что можно было бы рассматривать шаблоны выражений как особую форму генераторов объектов, поскольку все, что они делают, - это конструирование сложных типов с помощью типов операндов и данных, которые вы обычно можете указывать также вручную. За исключением того, что они неявно вызывают генераторы

a + b + c =>
  Add<Add<A, B>, C>(...)
...