获取std ::函数来推导按引用传递/按值传递

时间:2018-09-11 20:15:21

标签: c++ c++11

我正在编写一个将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&...)正常工作,但是我无法无需显式编写与传递类型相匹配的模板即可工作,那时候我也可能根本不使用模板。

如何自动处理传递类型?此外,能够自动处理prvalues也很不错。如果可能的话,我也想将其限制为c ++ 11。

3 个答案:

答案 0 :(得分:0)

为响应更好的解决方案而进行了编辑:

您要在此处使用的是斯科特·迈耶斯(Scott Meyers)所说的通用参考书:

req.body.exames.hematologia
// => Hematologia
req.body.exames.vhs
// => VHS

当模板参数后跟双与号时,根据您传递的值,它将是左值引用或右值引用。然后,您调用std :: forward,它将继续使用正确的引用类型。

答案 1 :(得分:0)

template<typename T_Func, typename ...T_Args>
inline int get_stats(T_Func f, T_Args&&... args)
{
    return f(args...);
}

int foo(int x, double y)
{ return x + y; }

int goo(int& x, double& y)
{ return x - y; }

int hoo(int x , double& y)
{ return x * y; }


int main()
{

    int x = 42;
    double y = 1.5;
    cout << get_stats(foo, x, y) << endl;
    cout << get_stats(goo, x, y) << endl;
    cout << get_stats(hoo, x, y) << endl;

    return 0;
}

答案 2 :(得分:0)

实际上,您需要结合两个先前的答案。 KorelK的答案以避免尝试推断出传递的函子的确切签名,而CJ13的答案则使用完美转发:

template<typename T_Func, typename ...T_Args>
inline int get_stats(T_Func f, T_Args&&... args)
{
    return f(std::forward<T_Args>(args)...);
}

Online