5

いつもiOSとMacの目的のCフレームワークでプログラミングした後、NSNotificationCenterクラスとNSNotificationクラスで実装されている一般的な通知パターンが大好きです。私はいつもほとんどのもののために私の言葉の言語だったC++に戻って、私は自分自身がこのパターンを複製しようとしていて、そこにそれをサポートする同様のC++クラスのジェネリックな実装が本当に存在すべきだと考えています。C++の通知センター

パターンは、後でより動的な性質があるため、Objective CよりもC++で実装する方が幾分難しいようですが、不可能とは思われません。私はブーストライブラリを見てきましたが、彼らは一般的に素晴らしいと私の運を見つけることは悲しいです。 boost :: bind、boost :: lamda、boost ::関数はほとんどの作業をしているようです。明白な何かを逃したことがありますか? NSNotification/NSNotificationCenterの動作を簡単に複製できるようにするための既存のものはありますか?

+0

Boost.signalsを試しましたか? – anno

+0

私は一見を持っています、提案のおかげで。 – jbat100

+0

少し異なるアプローチで、Qtは専用の前処理ツール(moc <->メタオブジェクトコンパイラ)を使って "シグナルとスロット"を実装しました。ただし、お客様のニーズに合ったものを使用することは妥当です。 –

答えて

1

boot :: signalを見るための@ annoの勧告に従うと、予想通り、目的のCの解決策ほど単純ではありませんが、検討の結果、可能なオプションのように見えます。 boost::signal tutorialを見て、私は手元の問題の最も関連性の高い側面を調べると思った。通知の送信者を作成するには


は、クライアントが情報が到着すると、すべての接続されたクライアントにニュースを送るニュースプロバイダに接続する簡単なニュース配信サービスを、考えてみましょう。ニュース配信サービスは、次のように構築することができる。

class NewsItem { /* ... */ }; 
boost::signal<void (const NewsItem&)> deliverNews; 

deliverNewsの目的NewsItemが生成されたことをオブザーバーに通知することです。


オブザーバーは(ブースト::バインドライブラリを使用して)次のように追加することができます。

クライアントニュースの更新を受け取りたいだけdeliverNewsにニュースアイテムを受け取ることができる関数オブジェクトを接続する必要があります信号。例えば、我々はリストから割り当て解除されているオブザーバーを除去する問題に対処するためには、具体的にニュースを例えば,:

struct NewsMessageArea : public MessageArea 
{ 
public: 
    // ... 

    void displayNews(const NewsItem& news) const 
    { 
    messageText = news.text(); 
    update(); 
    } 
}; 

// ... 
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */); 
// ... 
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1)); 

を我々のアプリケーションで特別なメッセージ領域を有していてもよく、後押し::信号は

ただし、以下のソリューションを提供しています、どのようなユーザーはdeliverNewsが知っている newsMessageAreaオブジェクトを破壊し、ニュースメッセージ領域を閉じた場合は?おそらく、 セグメンテーションフォルトが発生します。しかし、Boost.Signalsの場合、 はNewsMessageAreaのみを追跡可能にし、newsMessageAreaが であれば、 newsMessageAreaのスロットは切断されます。追跡可能 オブジェクトの使用中に大きな制約がある

struct NewsMessageArea : public MessageArea, public boost::signals::trackable 
{ 
    // ... 
}; 

このとき:NewsMessageAreaクラスは、ブースト::信号::追跡可能なクラス、例えばから公に を導出することにより、追跡可能な作られてスロット接続を作る: Boost.Bindを使って構築された関数オブジェクトは、boost :: bindに渡される 追跡可能オブジェクトへのポインタまたは参照が見つけられて追跡されるように理解されています。

2

理論上は、特定の通知が呼び出されたときに呼び出す関数ポインタのベクトルを持つクラスを作成できます。オブジェクトが通知をプッシュするときに呼び出す関数のベクトルである辞書を持つクラス

2

その他の回答に記載されているboostパッケージに加えて、別のオプションはpoco::NotificationCenterです。

この実装は、カカオ通知フレームワークに近い、などの具体的ポコのdocumentationで議論:

通知センタークラスは基本的に、Appleのココア(またはのOpenStep)に見出さ NSNotificationCenterクラスのC++インプリメンテーションです。

関連する問題