operator()
コールバックの目的で Loki::Functor を使用しており、 2 つのコールバック間でファンクター (適切なメンバー関数が定義されたオブジェクト) を共有したいと考えています。このファンクターは、両方のコールバックが参照できるように状態を保持する必要があります。
簡単なテストでは、値渡しのファンクターで Loki ファンクターを構築すると、メンバー関数ポインター コンストラクターを使用した場合とは異なる結果になることが示されています。
#include "loki/Functor.h"
struct Bar {
int x;
void inc() { ++x; }
int operator()() { return x; }
int get() { return x; }
};
Bar b;
Loki::Functor<int, Loki::NullType> f1(b);
Loki::Functor<int, Loki::NullType> f2(&b, &Bar::get);
Loki::Functor<int, Loki::NullType> f3(&b, &Bar::operator());
cout << f1() << endl; // prints '0'
cout << f2() << endl; // prints '0'
cout << f3() << endl; // prints '0'
b.inc();
cout << f1() << endl; // prints '0'
cout << f2() << endl; // prints '1'
cout << f3() << endl; // prints '1'
f2
は、メンバ関数ポインタとインスタンスへのポインタを使用すると、 とは異なる動作になることを示していf1
ます。次にf3
、loki ファンクター間でファンクターを共有するための可能な方法としてそれ自体を提案します。
f1
Loki::Functor でサポートされている「コピー セマンティクス」に関連していると思います - ファンクターのコピーが作成され、 の新しい値を持ちますが、私が望むことを行います - 実際のインスタンスは loki ファンクターによって参照され、したがって共有されx
ますそれらの間の。f2
f3
f3
したがって、ファンクターの同じ実際のインスタンスBar
を 2 つの loki ファンクター ( f2
& ) にバインドする最良の方法があるかどうか、または構文f3
に沿ってそれを行うためのより良い/よりクリーンな方法があるかどうかを知りたいですか?f1
編集: 時代遅れの Loki を使用している理由を尋ねる人もいるかもしれません。これは、グローバルな静的が厳密に禁止されている、制約のある開発環境で必要なものを提供します (ただし、loki/Functor.h から Small Object シングルトンを削除する必要がありましたが、それは簡単でした)。代替の一般化されたファンクター ライブラリの提案があれば、制約について詳しく説明します。