関数オブジェクトから状態を取得したい。ただし、関数オブジェクトはfunction<>
テンプレートにキャストされています。どうすればいいですか?
つまり:
関数オブジェクト:
class Counter {
private:
int counter_;
public:
Counter():counter_(0) {cout << "Constructor() called" << endl;}
Counter(int a):counter_(a) {cout << "Constructor(a) called" << endl;}
void operator()(int sum) {
cout << counter_++ + sum << endl;
}
int getCounter() { return counter_;}
};
主に。私の最初のステップは、オブジェクトを直接使用することです。
int main() {
Counter a(10);
a(0);
a(0);
cout << "Counter: " << a.getCounter() << endl;
そのショー:
コンストラクタ(a)と呼ばれる
10
11
カウンター:12
それは大丈夫です、そしてそれは私が期待したものです。
しかし、
Counter b(10);
function<void(int)> f = b;
f(0);
f(0);
cout << "Counter: " << b.getCounter() << endl;
それが示している
コンストラクタ(a)と呼ばれる
10
11
カウンター:10
ああ!、fは実際のオブジェクトのラッパーだと思ったので、変更するf
と実際に変更されb
ます。いいえ:f
のコピーがありますがb
、呼び出すことができません。f.getCounter()
どのようにしてState(counter_ var)を取得できf
ますか?
Counter
同じシグネチャ「void(int)」を持つ他の同様のクラスがいくつかあるため、(この例では)クラスを直接使用することはできません。また、呼び出し元の関数でそれらを不明瞭に使用したいと思います。
すべての関数オブジェクトに共通の基本クラスを使用してテンプレートを完全に回避することはできstd::function
ますが、STLとテンプレートを使用したC++11のソリューションがもっとあると思います...
それで、その解決策はありますか?
ありがとう