Я надеялся, что в одном из мест, где я смогу использовать новый вывод аргумента шаблона, было построение std::set
/std::map
/любых других контейнеров с пользовательскими компараторами. Моя цель — создать однострочный оператор, который создаст эффективный набор. с лямбда компаратором. Что я могу сделать с С++ 11:
std::set<int, std::function<bool(int, int)>> s([](int a, int b) {return a > b;});
Но так как он использует std::function
, он заметно медленнее.
Другой вариант:
auto mycomp = [](int a, int b) {return a > b; };
std::set<int, decltype(mycomp)> s(mycomp);
Он выполняет свою работу, но 1) требует 2 строки и создание переменной mycomp
2) мне нужно явно передать тип mycomp
.
Как я читал на справочных страницах, ни в одном из стандартных контейнеров нет руководства по дедукциям для такой ситуации. К сожалению, я боюсь, что это невозможно сделать даже с текущим стандартом языка (С++ 17), как можно найти:
Вывод аргумента шаблона класса выполняется только в том случае, если список аргументов шаблона отсутствует. Если указан список аргументов шаблона, вывод не выполняется.
Что стоит за этим? Почему они не разрешили частичный вывод аргумента? Я предполагаю, что есть некоторые проблемы с этим, которые я упускаю из виду, но, на мой взгляд, это было бы более чем полезно.
std::initializer_list<int>{}
, просто чтобы указать типint
, очень уродлив. 28.05.2018