【发布时间】:2017-07-19 05:49:55
【问题描述】:
在下面的代码中,我有一个名为data 的变量。它在自身内部包含一个函数,以便稍后调用它们。假设data 是在另一个库中定义的,我无法更改它的类型。我为它的每个成员分配了一个模板函数,其中该函数的一部分是已知的 (s3),并且在调用它时必须给出一部分 (true)。我不能通过这样的事情:
data[0]=test_func(?,s3); // error
相反,我必须将 lambda 函数传递给它:
data[0]=[](bool b){test_func(b,s3);}; // ok
但是 lambda 函数看起来并不整洁,尤其是当我们有一个包含 100 个这些赋值的数组时。有什么方法可以通过以任何方式更改 test_func 来避免 lambda 函数吗?即使在 test_func 中使用 lambda 对我来说也是可以的,因为它只写了一次。
#include <iostream>
#include <functional>
template<typename F>
void test_func(bool b,F f)
{
if(b)
f();
}
void s1()
{
std::cout<<"s1 \n";
}
void s2()
{
std::cout<<"s2 \n";
}
void s3()
{
std::cout<<"s3 \n";
}
int main()
{
test_func(true,s1);
test_func(true,s2);
test_func(false,s1);
test_func(true,s2);
/////////////////
std::function<void(bool)> data[100];
// data=test_func(?,s3); // error
data[0]=[](bool b){test_func(b,s3);}; // ok
data[0](true);
return 0;
}
【问题讨论】:
-
不就是
std::function<void (bool)> foo(F f) { return [](bool b) { test_func(b, f); }; }吗? -
就目前而言,最好的解决方案是简单地使用 lambda 函数。
std::bind试图这样做,但使用它需要学习它的迷你语言(对于任何阅读代码的人),并且往往会使编译器更难优化。此外,它最终只比 lambda 函数短。 -
@melpomene,您如何将其放入此代码中?
-
@Justin,函数可以返回 lambda 吗?喜欢
combine(test_func,s3)。 -
@ar2015
data[0] = foo(s3);
标签: c++ c++11 templates lambda std-function