Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function calling any specified function

Tags:

c++

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.

like image 775
user3900460 Avatar asked Oct 20 '22 07:10

user3900460


1 Answers

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)...);
}
like image 67
Angew is no longer proud of SO Avatar answered Oct 21 '22 22:10

Angew is no longer proud of SO