ラムダを理解するためのテストをしています。私は、主機能で直接関数を書き換える機能をユーザに提供しようとしています。私に説明させてください:ラムダで関数を書き直すようにユーザーに提案する
#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のような関数を書き換える最善の方法は何でしょうか?ラムダで?ラムダなし?
私はJavascriptのようにしたい、そのような関数をオーバーロードする:newB.somefunction = function(...){...} ;.私はこの機能を私のライブラリのユーザがソースコードで書いて欲しい。コールバック関数です。
私の質問は次のとおりです:どのようにクラス/オブジェクトの外にメソッドを書き換えるコールバック関数やラムダ式を記述するのですか?変数でエクサゴンが提案し
ソリューション:
#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;
}
ライブデモで?またはアプリケーションの実行時に関数の書込みをしたいのですか? ...後者については、[ChaiScript](http://chaiscript.com/)をチェックしてください – WhiZTiM
こんにちはChaiScript、私はJavascriptのようにしたい、そのような関数をオーバーロードする:newB.somefunction = function(...){。 ..} ;.私は関数を、私のライブラリのユーザーがソースコードで正確に書いて欲しいです。 – AkrogAmes
あなたはコールバックの何らかの形をしたいと思うように思えます。 'std :: function <>' intコンストラクタを受け入れるようにクラスを変更し、executeを呼び出すときにそれを呼び出します。 – GManNickG