C++ позволяет нетиповым параметрам шаблона иметь тип указателя, включая указатель на функцию. Недавно я спросил вопрос о том, для чего это полезно, и это продолжение одного из ответов.
Можно ли вывести значение параметра шаблона указателя функции из аргумента функции, который является рассматриваемым указателем функции? Например:
using VoidFunction = void(*)();
template <VoidFunction F>
void templ(VoidFunction);
...
void func(); // a VoidFunction
...
templ<func>(func); // works, but I have to specify the template parameter explicitly
templ(func); // <-- I would like to be able to do this
Есть ли способ заставить этот вывод произойти? Это кажется технически возможным с точки зрения разработчика компилятора, если аргумент функции может быть преобразован в функцию в коде во время компиляции.
Если вас интересует мотивация этого, см. комментарии под этим ответом, в частности возможную оптимизацию для реализации std::bind()
.
EDIT: я понимаю, что могу просто удалить аргумент функции и использовать аргумент шаблона, как в templ<func>()
. Моя единственная цель добавления аргумента функции состояла в том, чтобы попытаться избежать передачи аргумента шаблона.
Я думаю, что я действительно хочу, это также вывести тип указателя функции, как в:
template <typename Function, Function F>
void templ(/* something */);
а потом можно позвонить
templ(func);
or
templ<func>();
и сделать так, чтобы и тип, и значение выводились из одного упоминания указателя на функцию.
Надеюсь, теперь это имеет больше смысла.
template<std::size_t N> void foo(std::size_t i) {int arr[N]; /*fill*/ return arr[i];}
. Я определенно хотел бы получить ошибку, если бы забыл аргумент шаблона, когда можно было бы сделать этот вывод. - person chris   schedule 19.07.2013templ<func>();
недостаточно? - person chris   schedule 19.07.2013T
изtemplate<using typename T, T t>
, но я не думаю, что это удалось. - person chris   schedule 19.07.2013template <typename Function> templ(Function func);
? - person Igor Tandetnik   schedule 19.07.2013