我正在尝试在lambda的末尾添加一行代码,类似于+=
运算符对std::string
的作用。例如:
std::function<void()> foo = []() {
std::cout << "User defined code\n";
};
foo += [](){ std::cout << "I added this"; };
调用foo()
后所需的输出:
User defined code
I added this
当然,这实际上并不像书面那样工作。
这是可能的,还是有另一种方法来有效地完成同样的事情?也许将lambda复制到另一个std :: function然后通过值传递给一个新的lambda或什么?
编辑:
我正在和一个用lambda初始化的std::function
成员(foo
)一起工作。它的成员函数直接调用它(使用foo()
),我需要调用它以便每次调用foo
时,都会调用另一个函数。然而,这可以做得很好,只要foo
仍然可以用foo();
调用。
如果你可以改变成员的类型,这样的事情可能会这样做:
class Functions
{
public:
using Function = std::function<void()>;
Functions() = default;
template<typename Fn>
Functions(Fn f) { functions.push_back(f); }
Functions& operator+=(Function f)
{
functions.push_back(f);
return *this;
}
void operator()()
{
for (auto& f: functions)
{
f();
}
}
private:
std::vector<Function> functions;
};
Functions foo = []() { cout << "Hello"; }
foo += []() { cout << ", world!"; };
foo();
这个解决方案是我能为您的问题找到的最接近的解决方案:
class Lambdas
{
vector<function<void()>> lambdas;
public:
Lambdas(function<void()> lamb)
{
lambdas.push_back(lamb);
}
Lambdas& operator+=(function<void()> lamb)
{
lambdas.push_back(lamb);
return *this;
}
void operator()()
{
for (int i = 0; i<lambdas.size(); i++)
{
lambdas[i]();
}
}
};
希望这可以帮助。