マルチスレッド アプリケーションで、自動接続管理でブースト シグナル 2 を使用したいと考えています。私のクラスはから継承してenable_shared_from_this<>
おり、別のメンバー メソッド内からメンバー メソッドを接続したいと考えています。接続は頻繁に再構築される可能性があるため、コードは可能な限り高速にする必要があります (ブースト signal2 のパフォーマンス自体にもかかわらず):
typedef boost::signals2::signal<void ()> signal_type;
struct Cat : public enable_shared_from_this<Cat>
{
void meow ();
void connect (signal_type& s)
{
// can't write this
s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (weak_from_this ()));
// ok, but slow?! two temporary smart pointers
weak_ptr<Cat> const myself (shared_from_this ());
s.connect (signal_type::slot_type (&Cat::meow, this, _1).track (myself));
}
// i am missing something like this in the base class
// protected:
// weak_ptr<Cat> const& weak_from_this ();
};
私の設計目標が矛盾している可能性があることは知っていますが(自動接続管理とスレッドセーフだけでなく、高速コードも)、とにかく:
enable_shared_from_this<>
組み込みへの直接アクセスが欠けているのはなぜweak_ptr<>
ですか? 反対する理由が見当たりません。私のようなユースケースはありませんか?上記よりも速い回避策はありますか?
編集:
私はこのように考えられることを知っていますが、追加のストレージ/初期化チェックのペナルティを避けたいです:
template <typename T>
struct enable_weak_from_this : public enable_shared_from_this<T>
{
protected:
weak_ptr<T> /* const& */ weak_from_this ()
{
if (mWeakFromThis.expired ())
{
mWeakFromThis = this->shared_from_this ();
}
return mWeakFromThis;
}
private:
weak_ptr<T> mWeakFromThis;
};