Templates and generic programming
T.44
Используйте шаблоны функций для вывода аргументов шаблона класса (где применимо)
Причина
Явное написание аргументов типа шаблона может быть утомительным и излишне многословным.
Пример
tuple<int, string, double> t1 = {1, "Hamlet", 3.14}; // явный тип
auto t2 = make_tuple(1, "Ophelia"s, 3.14); // лучше; выведенный тип
Обратите внимание на использование суффикса s, чтобы гарантировать, что строка является std::string, а не строкой в стиле C.
Примечание
Поскольку функцию make_T легко написать самому, это может сделать и компилятор. Поэтому функции make_T могут стать избыточными в будущем.
Исключение
Иногда не существует хорошего способа вывести аргументы шаблона, а иногда требуется задать их явно:
vector<double> v = { 1, 2, 3, 7.9, 15.99 };
list<Record*> lst;
Примечание
C++17 делает это правило избыточным, разрешая напрямую выводить аргументы шаблона из аргументов конструктора: Вывод параметров шаблона для конструкторов (Ред. 3). Например:
tuple t1 = {1, "Hamlet"s, 3.14}; // выведено: tuple<int, string, double>
Контроль
Помечать случаи, когда явно заданный тип специализации точно совпадает с типами используемых аргументов.