【发布时间】:2020-09-13 16:55:38
【问题描述】:
我正在尝试概括我的基准测试函数,让它接收基准函数作为第一个参数,将迭代次数作为第二个参数。
但是由于要进行基准测试的函数需要接收额外的参数,所以我想我会在 lambda 函数的主体中填写参数并将其传递给基准测试函数。 (我认为这叫做柯里化?)
无论如何我无法编译:
main.cpp:43:62:错误:从 'main(int, char**)::函数声明如下所示:
void bench(std::function<double*()>& funct_to_bench, int repeats);
我是这样使用它的:
bench::bench([=](){rng::gpu_r_exp((int) 10e6, lambda);}, 50);
由于编译器再次对non-const 争论不休,我应该补充一点,gpu_r_exp 使用了一个存储rngState 的全局变量(它也不喜欢gpu_r_exp 中的非常量参数)。
我真的被困住了。我只是想填写参数并将预先准备好的函数句柄传递给基准函数,以便它可以包装一个带有进度条的计时器。
编辑:我要补充一点,叫做lambda的参数是一个double,它是指数分布的参数,与lambda函数无关。
【问题讨论】:
-
lambda 不是
std::function。您需要将std::function传递给函数,因为它需要非常量左值引用。 -
@NathanOliver stackoverflow.com/questions/6458612/… 接受的答案说选项 1 有效,这几乎就是我使用的,对吧?
-
您的函数使用的是
std::function &,这与std::function不同。非常量左值引用(std::function &是)不允许转换。你必须准确地给出它是什么。 -
@FelixB。在
void foo(int&)中,int&是非常量左值引用。在void foo(const int &)中,const int &是一个 const 左值引用。在void foo(int&&)中,int&&是一个右值引用。在void foo(const int&&)中,consat int&&是一个 const 右值引用。 -
@FelixB。不。就像我说的:非常量左值引用不允许转换。你必须准确地给出它是什么。由于 lambda 不是
std::function它不会工作。一个 const-lvalue 引用确实允许转换并让代码工作。