1

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 ファンクター間でファンクターを共有するための可能な方法としてそれ自体を提案します。

f1Loki::Functor でサポートされている「コピー セマンティクス」に関連していると思います - ファンクターのコピーが作成され、 の新しい値を持ちますが、私が望むことを行います - 実際のインスタンスは loki ファンクターによって参照され、したがって共有されxますそれらの間の。f2f3

f3したがって、ファンクターの同じ実際のインスタンスBarを 2 つの loki ファンクター ( f2& ) にバインドする最良の方法があるかどうか、または構文f3に沿ってそれを行うためのより良い/よりクリーンな方法があるかどうかを知りたいですか?f1

編集: 時代遅れの Loki を使用している理由を尋ねる人もいるかもしれません。これは、グローバルな静的が厳密に禁止されている、制約のある開発環境で必要なものを提供します (ただし、loki/Functor.h から Small Object シングルトンを削除する必要がありましたが、それは簡単でした)。代替の一般化されたファンクター ライブラリの提案があれば、制約について詳しく説明します。

4

0 に答える 0