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;
}