1

私は簡単なセットアップをしています

class Container {
    Handler h;
}

すべての Container オブジェクトには「warning()」メソッドがあります。Handler オブジェクト内から警告を出力する方法も必要ですが、含まれているオブジェクトの機能を使用してこれらの警告を送信します。

含まれているオブジェクトでコンテナーへの参照を保持するのは奇妙だと思います (通常、含まれているオブジェクトはそのコンテナーについて何も知らないはずです)。さて、クロージャーのある言語では、次のようにします(架空の構文):

h.set_warning_handler { | char* message |
    this->warning(message)
}

しかし、私は C++ で作業しており、ブロックなどの Apple 方言を使用する場所ではありません。これに取り組むための好ましい方法は何ですか?それとも、その参照を設定して忘れますか?

4

1 に答える 1

5

C++11 にはクロージャがあります:

h.set_warning_handler([&](char const* message) { this->warning(message); });

[&]参照によってコンテキストをキャプチャすることを指定します (キャプチャする必要がありますthis)。(…)引数リストと{…}ラムダの本体を宣言します。

または、コンテナに依存させることもできます。Handlerこれにより非常に強い結合が発生するため、回避した方がよい場合もありますが (たとえば、C++11 の機能をまだ使用できない場合)、強い結合はインターフェイスを使用して弱めることもできます (以下では遅延バインディングを使用します。テンプレートの方が適切かもしれません):

struct CanWarn {
    virtual void warning(char const*) const = 0;
    virtual ~CanWarn() { }
};

class Handler {
    CanWarn const* warning_dispatcher;

public:

    void set_warning_dispatcher(CanWarn const* dispatcher) {
        warning_dispatcher = dispatcher;
    }

    …
};

class Container : public CanWarn { … };
于 2012-08-01T21:13:55.673 に答える