2

c#には、それを宣言したクラスからのみ呼び出すことができる特別な種類のデリゲートであるeventキーワードがあります。それで、boost :: signal2を使用してネイティブC++でこれを行う方法はありますか?もしそうなら、パフォーマンスの観点からそれは高価ですか?

4

1 に答える 1

3

一般に、C ++関数の呼び出し可能性を制限するアプローチは、そのクラスの外部でインスタンス化できない型のダミーパラメーター(目的のクラスの「friend」宣言を持つプライベートファクトリまたはコンストラクター)を渡すことに依存します。

ただし、これをboost :: signal2 :: signalに適用すると、無関係なパラメーターを持つシグナル定義が生成されます。

本当に呼び出し不可能にする必要がある場合は、それが単なるオブジェクトメンバーであることを忘れないでください(少なくとも、私が使用しているので...)-プライベートまたは保護されたメンバーとして宣言し、に接続するためのパブリック関数を提供できますそれ。

class FooEmitter
{
public:
    boost::signals2::scoped_connection ConnectToFoo(boost::function<void (Emitter&)>& handler)
    {
        return fooSignal.connect(handler);
    }

    void triggerFoo() {
        fooSignal(*this);
    }
private:
    boost::signals2::signal<void (Emitter&)> fooSignal;
};

class FooHandler
{
public:
    FooHandler()
    {
        fooConnection = getAnEmitter().ConnectToFoo(boost::bind(&FooHandler::HandleFoo, this, _1);
    }

    void HandleFoo(Emitter&)
    {
        // handler body
    }

private:
    boost::signals2::scoped_connection fooConnection;
}

もちろん、モデルが十分に剛性がある場合は、ConnectToFooメソッドを再配置してFooHandler&を取得し、そこでバインディングを実行することもできます。

パフォーマンスの面では、ダミー型は優れたコンパイラーで効果的に解放されます。このメカニズムは、(シグナルごとではなく)ハンドラーごとに1回または2回の追加の関数呼び出しです。

于 2011-09-19T02:27:11.387 に答える