コールバックをクラスに保存しようとしています。現在、私は次のようなことをしています。
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つの異なる形式を作成できますが、任意の数と種類の引数を使用して関数を格納すると、混乱します。可能であれば、このような構文をどのように使用できますか?そうでない場合、構文はどの程度近くなりますか?