Позволят ли аргументы шаблона C++17 с автоматической функцией ограничивать объекты std::function?
С появлением в C++17 функции не типовых аргументов шаблона с auto, можно будет реализовать std::function
таким образом, чтобы можно было, например, поставить следующие функции:
bool f(int n, double d) {}
bool g(bool b, char c) {}
bool h(bool b) {}
в авто-шаблон std::function
объекты:
std::function<bool(auto, auto)> faa = f; // ok
std::function<bool(int, auto)> fia = f; // ok
std::function<bool(double, auto)> fda = f; // error: function type mismatch
std::function<bool(auto, auto)> gaa = g; // ok
std::function<bool(auto, auto)> haa = h; // error: function type mismatch
std::function<bool(auto)> ha = h; // ok
И так далее.
Другими словами, чтобы иметь std::function
объекты ограничены типами функций, которые они принимают?
(В настоящее время на GCC мы получаем error: 'auto' parameter not permitted in this context
.)
1 ответ
Это не нетипичные аргументы шаблона, поэтому auto
там не разрешено в C++17.
Аргументы шаблонных типов не являются аргументами шаблонов, которые являются указателями или целыми числами или аналогичными фактическими значениями, а не типами.
Например,
std::integral_constant<std::size_t, 7>;
здесь 7
является нетиповым аргументом шаблона типа std::size_t
и значение 7
,
Нетипичный шаблон auto
разрешает что-то вроде:
template<auto x>
using integral = std::integral_constant< decltype(x), x >;
сейчас integral<7>
является std::integral_constant<int, 7>
,
С другой стороны, ваше использование auto
находится на месте типа, а не типа.
Существует функция, которая определяет тип шаблона, поэтому вы можете написать:
std::function faa = f;
если они увеличены std::function
чтобы иметь возможность вывести подпись из указателя на функцию (или вызываемый не шаблон).
Обратите внимание, что это std::function
будет иметь фиксированную подпись, а не шаблонную. Функция просто позволяет удерживать, а не шаблон динамической отправки.
Я не знаю, если std::function
был расширен таким образом в C++17, но была добавлена языковая функция для этого.