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()
.
РЕДАКТИРАНЕ: Осъзнавам, че мога просто да премахна аргумента на функцията и да използвам аргумента на шаблона, както в 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