How to write a function calling any specified function (or function object) with specified arguments?
Here's what I tried:
#include <iostream>
#include <functional>
using namespace std;
template <typename RetType, typename... ArgTypes>
RetType q(function<RetType(ArgTypes...)> f, ArgTypes... args)
{
return f(args...);
}
int h(int a, int b, int c) { return a + b + c; }
int main()
{
auto r = q(h, 1, 2, 3);
cout << "called, result = " << r;
return 0;
}
The compiler says, that template argument deduction/substitution failed due to mismatched types 'std::function<_Res(_ArgTypes ...)>' and 'int (*)(int, int, int)'.
I'm not sure why template arguments can't be deduced in my code.
Since it's a template anyway, you don't need std::function
at all. Just do this:
template <class F, class... Arg>
auto q(F f, Arg... arg) -> decltype(f(arg...))
{
return f(arg...);
}
Even better, use perfect forwarding:
template <class F, class... Arg>
auto q(F f, Arg&&... arg) -> decltype(f(std::forward<Arg>(arg)...))
{
return f(std::forward<Arg>(arg)...);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With