関数から受け取ったオブジェクトのメソッドの参照を格納します

ルーベン・メドラノ

オブジェクトの非静的メソッドDummyを別のオブジェクトの関数に渡すことができました。そのメソッドの参照を関数のオブジェクトに格納しようとすると問題が発生します。その方法がわかりません。

#include <iostream>
#include <functional>

class Dummy{
public:
    void runDummyArgs(int z){std::cout<<"TEST: "<<z<<std::endl;};
};

class Test{
public:
   
    template<typename X , typename T>
    void runTest(X* obj, T(X::* func), int z) { (obj->*func)(z); }; 
    /* It works, but I would like to store (obj->*func) in this class as a reference to reuse it when it is needed. */
};

int main()
{
    Dummy *a = new Dummy();
    Test *b = new Test();
    b->runTest(a, &Dummy::runDummyArgs, 99);
    return 0;
}
user4581301

私は次のようなものを書きます:

#include <iostream>
#include <functional>

class Dummy{
public:
    void runDummyArgs(int z){std::cout<<"TEST: "<<z<<std::endl;};
};

class Test{
    std::function<void(int)> mFunc; // added member to hold function
public:
    // added constructor to accept function
    Test(std::function<void(int)> func): mFunc(func)
    {

    }
    // no longer needs any templating. It's all handled by std::function
    // most of the parameters bound by std::function 
    void runTest(int z)
    {
        mFunc(z);
    };
};

int main()
{
    Dummy a; // no need for dynamic allocation. Only use new when forced
             // and that's almost never thanks to containers and smart pointers 

    // This line gets a bit weird. I'll explain it below
    Test b([&a](int z){a.runDummyArgs(z);});

    b.runTest(99); // just needs the end argument of the function
    return 0;
}

OK。それはそれほど悪くはありません。を除いて

Test b([&a](int z){a.runDummyArgs(z);});

Teststd::functionを取り、int何も返さない必要です。[&a](int z){a.runDummyArgs(z);}ラムダ式ぎこちないビットと詳細に入る詳細なドキュメント)であり、を受け取り、int何も返さない呼び出し可能なオブジェクトを定義します。結果のインスタンスはと呼ばれbます。ラムダをさらに分解する:

[&a]

a参照によって変数キャプチャします。これによりa、ラムダ内の変更可能になりますaたとえばa、関数が後で呼び出されたときに存在しない一時変数である場合、ラムダに独自のコピーを実行させたい場合がありますダングリング参照とconst Dummyコンパイラエラーに関する一般的な将来の質問を回避するためにmutable、この回答の最後に値によるキャプチャの簡単な例を追加します。

(int z)

ラムダのパラメーター

{a.runDummyArgs(z);}

呼び出す関数本体runDummyArgsの上にa

可変値の例によるより複雑なキャプチャ:

#include <iostream>
#include <functional>

class Dummy{
    int val = 0; // provide some visible state for instances
public:
    void runDummyArgs(int z)
    {
        std::cout<<"TEST: "<<z + val << std::endl;
        //                     ^ added to show changing state
        val++; // change state
    }
};

class Test{
    std::function<void(int)> mFunc;
public:
    Test(std::function<void(int)> func): mFunc(func)
    {

    }
    void runTest(int z)
    {
        mFunc(z);
    };
};

std::function<void(int)> builder()
{
    Dummy a;
    return [a](int z)mutable{a.runDummyArgs(z);};
    //               ^ the copy of a can be modified.
} // a goes out of scope here, but its copy in the lambda lives on

int main()
{
    Test b(builder());
    b.runTest(99); // print 99
    b.runTest(99); // print 100
    Test c(builder());
    c.runTest(99); // print 99 because we have a copy of a different dummy instance
    c.runTest(99); // print 100
    return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ObjCの変数内にクラス、メソッド、またはオブジェクトを格納する

分類Dev

usingステートメントは、受け取ったオブジェクトへの参照を保持しますか?

分類Dev

mongodbから受け取ったオブジェクトの属性を取得します

分類Dev

C ++のメソッド内にオブジェクトを作成した場合、関数が戻ったときにオブジェクトは自動的に破棄されますか、それともメモリを消費し続けますか?

分類Dev

抽象クラスから派生したオブジェクトをメソッドのパラメーターとして受け取る

分類Dev

ByteBuddyで生成されたメソッドから、引数として受け取ったオブジェクトの(パブリック)インスタンスフィールドをMethodCallの戻り値に設定するにはどうすればよいですか?

分類Dev

オブジェクト参照を受け取るメソッドに実際のオブジェクトを渡す方法

分類Dev

角かっこで使用できるすべてのオブジェクトを受け入れる単一のC#メソッドを定義します

分類Dev

touchesBeganメソッドを使用してノードからオブジェクトへの参照を取得します

分類Dev

他のクラスからメソッドが呼び出されたときに、メソッドオブジェクトへの参照を取得します(javascript)

分類Dev

関数内で作成されたオブジェクトからのメソッド呼び出しをモックします(python)

分類Dev

クラスのタイプのみを受け入れるメソッドからオブジェクトを動的に返します

分類Dev

オブジェクトの関数/メソッドを実行します

分類Dev

メソッドを変数に格納してから呼び出すと、コンテキストオブジェクトがグローバルウィンドウオブジェクトに変わるのはなぜですか?

分類Dev

Python:オブジェクトのメソッドを初期化するための引数として関数を渡します。パイソンかどうか?

分類Dev

それが反射して、オブジェクトからメソッド参照や関数オブジェクトを取得することは可能ですか?

分類Dev

オブジェクトリテラルfooの外部から、foo内のメソッドの内部関数を呼び出す方法は?(以下のコードを参照)

分類Dev

コンソールでWebpackがクラッシュする:setStateは、更新する状態変数のオブジェクト、または状態変数のオブジェクトを返す関数を受け取ります

分類Dev

.getJsonの複数の.eachループから複数のオブジェクトを格納します

分類Dev

JSオブジェクト(レコード)を受け取るOCaml関数をラップします

分類Dev

オブジェクトとメソッドを使用して、区切り文字で区切られたリストにテキストを格納します

分類Dev

静的メソッドまたはOpenGLのもののために初期化されたオブジェクトからのメソッドを使用しますか?

分類Dev

複数のドメインを格納するオブジェクトを作成できますか?

分類Dev

Javascriptの同じオブジェクト内からsetTimeout関数を使用してオブジェクトメソッドを呼び出す

分類Dev

''セッション 'の定義が含まれておらず、タイプ'オブジェクト 'の最初の引数を受け入れる拡張メソッド' 'が見つかりませんでした

分類Dev

RestAPIから受け取ったJsonオブジェクトの解析

分類Dev

整数オブジェクト:値またはメソッドへの参照によって割り当てられますか?

分類Dev

カスタムオブジェクトを含むベクター:.atメソッドで受け取ったものを使用したいときにクラッシュする

分類Dev

所有オブジェクトのメソッドへの可変自己参照の受け渡し

Related 関連記事

  1. 1

    ObjCの変数内にクラス、メソッド、またはオブジェクトを格納する

  2. 2

    usingステートメントは、受け取ったオブジェクトへの参照を保持しますか?

  3. 3

    mongodbから受け取ったオブジェクトの属性を取得します

  4. 4

    C ++のメソッド内にオブジェクトを作成した場合、関数が戻ったときにオブジェクトは自動的に破棄されますか、それともメモリを消費し続けますか?

  5. 5

    抽象クラスから派生したオブジェクトをメソッドのパラメーターとして受け取る

  6. 6

    ByteBuddyで生成されたメソッドから、引数として受け取ったオブジェクトの(パブリック)インスタンスフィールドをMethodCallの戻り値に設定するにはどうすればよいですか?

  7. 7

    オブジェクト参照を受け取るメソッドに実際のオブジェクトを渡す方法

  8. 8

    角かっこで使用できるすべてのオブジェクトを受け入れる単一のC#メソッドを定義します

  9. 9

    touchesBeganメソッドを使用してノードからオブジェクトへの参照を取得します

  10. 10

    他のクラスからメソッドが呼び出されたときに、メソッドオブジェクトへの参照を取得します(javascript)

  11. 11

    関数内で作成されたオブジェクトからのメソッド呼び出しをモックします(python)

  12. 12

    クラスのタイプのみを受け入れるメソッドからオブジェクトを動的に返します

  13. 13

    オブジェクトの関数/メソッドを実行します

  14. 14

    メソッドを変数に格納してから呼び出すと、コンテキストオブジェクトがグローバルウィンドウオブジェクトに変わるのはなぜですか?

  15. 15

    Python:オブジェクトのメソッドを初期化するための引数として関数を渡します。パイソンかどうか?

  16. 16

    それが反射して、オブジェクトからメソッド参照や関数オブジェクトを取得することは可能ですか?

  17. 17

    オブジェクトリテラルfooの外部から、foo内のメソッドの内部関数を呼び出す方法は?(以下のコードを参照)

  18. 18

    コンソールでWebpackがクラッシュする:setStateは、更新する状態変数のオブジェクト、または状態変数のオブジェクトを返す関数を受け取ります

  19. 19

    .getJsonの複数の.eachループから複数のオブジェクトを格納します

  20. 20

    JSオブジェクト(レコード)を受け取るOCaml関数をラップします

  21. 21

    オブジェクトとメソッドを使用して、区切り文字で区切られたリストにテキストを格納します

  22. 22

    静的メソッドまたはOpenGLのもののために初期化されたオブジェクトからのメソッドを使用しますか?

  23. 23

    複数のドメインを格納するオブジェクトを作成できますか?

  24. 24

    Javascriptの同じオブジェクト内からsetTimeout関数を使用してオブジェクトメソッドを呼び出す

  25. 25

    ''セッション 'の定義が含まれておらず、タイプ'オブジェクト 'の最初の引数を受け入れる拡張メソッド' 'が見つかりませんでした

  26. 26

    RestAPIから受け取ったJsonオブジェクトの解析

  27. 27

    整数オブジェクト:値またはメソッドへの参照によって割り当てられますか?

  28. 28

    カスタムオブジェクトを含むベクター:.atメソッドで受け取ったものを使用したいときにクラッシュする

  29. 29

    所有オブジェクトのメソッドへの可変自己参照の受け渡し

ホットタグ

アーカイブ