首页 > 解决方案 > 获取 std::function 以推断按引用传递/按值传递

问题描述

我正在编写一个模板函数,它以 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 工作,此时我可能不会完全使用模板。hoof(T_Args...)f(T_Args&...)

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

标签: c++c++11

解决方案


编辑以响应更好的解决方案:

你想在这里使用的是 Scott Meyers 所说的通用参考:

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

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


推荐阅读