Позволят ли аргументы шаблона 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, но была добавлена ​​языковая функция для этого.

Другие вопросы по тегам