1

コールバックをクラスに保存しようとしています。現在、私は次のようなことをしています。

struct Callback {
    Callback (std::function<void ()> func) : func_ (func){}
    void call() const { func(); }

private:
    std::function<void ()> func_;
};

ご覧のとおり、特定のタイプの関数(現在は戻り値もパラメーターもありません)のみを使用できます。

このようなクラスを使用して、それを何と呼ぶか​​を渡す方法はありますか?

void increment (int &n) {
    ++n;
}

int main() {
    int someNum = 5;
    Callback callback (increment, someNum); //will call `increment (someNum);`
}

パラメータパックを使用して引数を格納し、aを使用しtypenameて戻り型を格納することを考えていました。次に、std::function<ReturnType (Args)> callback_ある種のものを作成し、のようなもので呼び出しましたcallback_ (givenArgs...);。しかし、私はこれを行うためのテンプレートについて十分な知識がありません。あるいは、それが可能かどうかさえ理解していません。

私がこれから(少なくとも今は)得ている本当の用途はタイマーですが、おそらくgeneric_function<>ラップする小さなクラスを作ることstd::function<>はもっと助けになるでしょう。ただし、この例では、2秒ごとに一時停止および一時停止を解除するタイマーは次のとおりです。

void togglePause (Countdown &c) {
    c.togglePause();
}

int main() {
    Countdown main (10000); //create countdown of 10s
    Countdown delay (2000, togglePause, main); //this one calls func when expired

    for (; !main.expired();) { //go while unpaused time < 10s
        delay.wait().reset(); //wait 2s, call callback, reset back to 2s
    }
}

もちろん、これは他の概念にも適用できますが、そもそもこの構文を実現する方法がわかりません。void関係のない前の質問からの戻り型が問題ない場合に備えて、2つの異なる形式を作成できますが、任意の数と種類の引数を使用して関数を格納すると、混乱します。可能であれば、このような構文をどのように使用できますか?そうでない場合、構文はどの程度近くなりますか?

4

1 に答える 1

5

std :: bindを使用して、引数のある関数を引数のない関数に変換したいと思います。

int main() {
    int someNum = 5;
    std::function<void (void)> boundFunc = std::bind(increment, std::ref(someNum));
    Callback callback (boundFunc); //will call `increment (someNum);`
}

someNumが参照によって渡されるようにするには、std :: refが必要であり、someNumがコールバックよりも長くスコープ内にとどまるようにする必要があることに注意してください。

于 2012-06-07T03:46:47.817 に答える