c++ - 获取 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 工作,此时我可能不会完全使用模板。hoo
f(T_Args...)
f(T_Args&...)
如何自动处理传递类型?此外,能够自动处理纯右值也很好。如果可能的话,我也想将其限制为 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 它将继续使用正确的引用类型。
推荐阅读
- python - 查找多个句子中的出现
- android - 搜索视图不使用 setOnQueryTextListener 过滤 ListView 数据
- python - 如何从python中的列表中删除所有重复元素?
- r - 通过循环赋值
- angular - Angular Heroes 示例中令人费解的 Typescript 函数语法
- spring-boot - 应用程序/x-www-form-urlencoded 的 Spring WebClient POST 和内容长度标头
- python - 如何在 pandasper 每天 9 点、12 点和 18 点创建自定义频率
- r - 所有计划的核心在用户代码中遇到错误(意外符号) - 但没有这样的代码
- amazon-web-services - Lambda 函数(有时)尝试访问 s3 时超时
- audio - 从 Linux 命令行同时播放视频文件和音频文件