Одно из мест, на которых я надеялся, что смогу использовать новый вывод аргумента шаблона, заключался в создании 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), как можно найти:
Вычисление аргумента шаблона класса выполняется только в том случае, если список шаблонов шаблонов отсутствует. Если указан список аргументов шаблона, то дедукция не выполняется.
Каковы причины этого? Почему они не разрешили частичный вывод аргумента? Я думаю, есть некоторые проблемы с этим, что я упускаю из виду, но, на мой взгляд, это было бы более чем полезно.