C ++ template callbacks with function pointer

I was wondering if it is possible to achieve something like this without error:

#include <iostream> template<typename T> T Sum(T _arg, T (*callbackFunction)(T)) { T result = (*callbackFunction)(_arg); return result; } template<typename T> T Callback(T _arg) { std::cout << "Callback is called" << std::endl; return _arg; } int main() { std::cout << Sum(10.2f, Callback); getchar(); return 0; } 

This is what I get:

 cannot use function template 'T Callback(T)' as a function argument could not deduce template argument for 'T' from 'float' 
+6
source share
2 answers

You cannot pass a function template as an argument, you must pass an instance, this is an example:

Live on coliru

 #include <iostream> template<typename T, typename F> T Sum(T arg, F f) { return f(arg); } template<typename T> T Callback(T arg) { std::cout << "Callback is called" << std::endl; return arg; } auto Callback2 = [](auto arg) { std::cout << "Callback2, a generic lambda, is called" << std::endl; return arg; }; int main() { std::cout << Sum(10.2f, Callback<float>) << std::endl; std::cout << Sum(10.2f, Callback2) << std::endl; std::cout << Sum(10.2f, [](auto arg) { std::cout << "An in-place generic lambda is called" << std::endl; return arg; }) << std::endl; getchar(); return 0; } 
+4
source
 #include <functional> #include <iostream> template<typename T> T Sum(T _arg, std::function<T(T)> callbackFunction) // Note the std::function replacement and how callbackFunction is called below { T result = callbackFunction(_arg); return result; } template<typename T> T Callback(T _arg) { std::cout << "Callback is called" << std::endl; return _arg; } int main() { std::cout << Sum(10.2f, Callback); getchar(); return 0; } 

That should work. This code is standard C ++ 11, you must include it in your compilation command.

+2
source

Source: https://habr.com/ru/post/983155/


All Articles