C ++添加到lambda的末尾

问题描述 投票:1回答:2

我正在尝试在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();调用。

c++ lambda
2个回答
0
投票

如果你可以改变成员的类型,这样的事情可能会这样做:

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();

0
投票

这个解决方案是我能为您的问题找到的最接近的解决方案:

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]();
        }
    }
};

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.