2017-01-29 10 views
0

ラムダを理解するためのテストをしています。私は、主機能で直接関数を書き換える機能をユーザに提供しようとしています。私に説明させてください:ラムダで関数を書き直すようにユーザーに提案する

#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; 
} 
+0

ライブデモで?またはアプリケーションの実行時に関数の書込みをしたいのですか? ...後者については、[ChaiScript](http://chaiscript.com/)をチェックしてください – WhiZTiM

+1

こんにちはChaiScript、私はJavascriptのようにしたい、そのような関数をオーバーロードする:newB.somefunction = function(...){。 ..} ;.私は関数を、私のライブラリのユーザーがソースコードで正確に書いて欲しいです。 – AkrogAmes

+0

あなたはコールバックの何らかの形をしたいと思うように思えます。 'std :: function <>' intコンストラクタを受け入れるようにクラスを変更し、executeを呼び出すときにそれを呼び出します。 – GManNickG

答えて

1

あなたはfunctionalヘッダからstd::functionを使用してこれを行うことができます。 std::functionのメンバーを作成し、このメンバーのセッターを作成します。 メンバー関数executeは、std::functionメンバーを呼び出す必要があります。 ラムダをセッターメソッドに渡すことができます。

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

出力は次のとおりです:

Hello World 
Hello World 
FOOBAR 

あなたが何かした後なので "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; 
} 

は、ここに私のアプローチであります同じ出力。

hereは、関数があなたの図書館の利用者がソースコードに書き込まれるようにしたいです

関連する問題