C++ 建议用户使用lambda重写函数

C++ 建议用户使用lambda重写函数,c++,lambda,c++14,C++,Lambda,C++14,我在做测试来了解兰博达斯。我试图为用户提供直接在主函数中重写函数的能力。让我解释一下: #include <iostream> using namespace std; class A { public: virtual bool execute() {}; }; class B : public A { public: bool execute() { cout << "Execute in B" << endl; } }; int m

我在做测试来了解兰博达斯。我试图为用户提供直接在主函数中重写函数的能力。让我解释一下:

#include <iostream>
using namespace std;

class A {
public:
    virtual bool execute() {};
};

class B : public A {
public:
    bool execute() { cout << "Execute in B" << endl; }
};

int main() {

    B newB;
    newB.execute();
    newB.execute() { cout << "Execute in New B" << endl; } ;
    newB.execute();

    return 0;
}
此源代码不起作用,因为重写这样的函数是非法的。在C++14中重写这样一个函数的最佳方法是什么?和lambda?没有lambda

我希望像Javascript一样重载这样的函数:newB.somefunction=function。。。{ ... };. 我希望函数由库的用户用源代码编写。在某种程度上是一个回调函数

我的问题是:如何编写回调函数或Lambda表达式来重写类/对象外部的方法

Exagon提出的解决方案,变量为:

#include <iostream>
#include <functional>
class B {

public:
    int global=0;
    std::function<void()> execute{
        [](){
            std::cout << "Hello World" << std::endl;
        }
    };
};

int main() {

    B newB;
    newB.execute();
    newB.execute();

    newB.execute = [newB](){std::cout << newB.global << "  = FOOBAR\n";};

    newB.execute();
    return 0;
}
您可以使用函数头中的std::function来实现这一点。 然后创建一个std::function成员并为此成员创建一个setter。 execute member函数需要调用这个std::function成员。 可以将lambda传递给setter方法。 我的做法如下:

#include <iostream>
#include <functional>

class B {
public:
    void execute() {_f();}
    void setFunction(std::function<void()> f){ _f = f;}
private:
    std::function<void()> _f{[](){std::cout << "Hello World" << std::endl;}};
};

int main() {

    B newB;
    newB.execute();
    newB.execute();

    newB.setFunction([](){std::cout << "FOOBAR\n";});

    newB.execute();
    return 0;
}
因为您正在寻找类似JavaScript的东西,所以可以这样做:

#include <iostream>
#include <functional>
class B {
public:
    std::function<void()> execute{
        [](){
            std::cout << "Hello World" << std::endl;
        }
    };
};

int main() {

    B newB;
    newB.execute();
    newB.execute();

    newB.execute = [](){std::cout << "FOOBAR\n";};

    newB.execute();
    return 0;
}
具有相同的输出


是实时演示

是否希望库用户使用源代码编写函数?还是希望应用程序的用户在运行时编写函数。。。对于后者,请检查Hello ChaiScript,我希望在Javascript中像这样重载一个函数:newB.somefunction=function。。。{ ... };. 我希望函数由我的库的用户用源代码编写。听起来你需要某种形式的回调。将类更改为接受构造函数中的std::函数,并在调用execute时调用它。我记不起回调这个术语了。谢谢你谁是你的用户,你为什么让他们写代码?您的产品是库还是编译器?
#include <iostream>
#include <functional>
class B {
public:
    std::function<void()> execute{
        [](){
            std::cout << "Hello World" << std::endl;
        }
    };
};

int main() {

    B newB;
    newB.execute();
    newB.execute();

    newB.execute = [](){std::cout << "FOOBAR\n";};

    newB.execute();
    return 0;
}