Я пишу шаблонную функцию, которая принимает std :: function в качестве входных данных и выполняет некоторую обработку функции.Мне нужен способ автоматической обработки любой функции, но у меня возникают проблемы с передачей по ссылке при выводе типа.
Тип функций, которые я использую, является общим, список аргументов также различается.типы.Вот репродуктор
#include <iostream>
#include <chrono> //c++11
#include <functional> //c++11
using namespace std;
// for use with functions passing by value
template<typename T_Out, typename... T_Args>
inline int get_stats( T_Out f(T_Args...), T_Args&... args)
{
f(args...);
return 0;
}
int foo(int x, double y)
{ return 0; }
int goo(int& x, double& y)
{ return 0; }
int hoo(int x , double& y)
{ return 0; }
int main()
{
int x = 42;
double y = 0.0;
cout << get_stats( foo, x, y) << endl;
return 0;
}
Приведенный выше шаблон работает на foo
, и я могу заставить hoo
работать, если заменить f(T_Args...)
на f(T_Args&...)
, но я не могу получить hooработать без явного написания шаблона, соответствующего типу передачи, который в тот момент я мог бы вообще не использовать шаблоны.
Как я могу автоматически обрабатывать тип передачи?Кроме того, было бы неплохо иметь возможность автоматически обрабатывать prvalues.Я хотел бы ограничить это до c ++ 11, если это возможно.