2011-01-08 9 views
2

std::functionを高速デリゲートに使用する方法と、追加または削除できるイベントの動作を示すコレクションにstd::functionを格納する方法について、この前にいくつか質問を投稿しました。私はまた、少しのEventArgタイプのクラスの全体を書くときにベストプラクティスを尋ねました、そして、その小さなデザイン決定もまた休まれました。これは素晴らしいコミュニティです!たくさんの機能とたくさんのLambda?

ここでは、プリアンブルとは別に、自分の構造を整えておく必要があります。入力データを処理するすべてのハンドラを記述する必要があります。

typedef std::function<void(const CommandData&)> CommandDelegate; 
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr; 
typedef std::map<short, CommandDelegatePtr> CommandMap; 

そして、私はこれまで、約200ハンドラを追加したい:私はこのようになりますこと、std::mapを持っています。私は、標準のメンバー関数とlambdaの間で選択肢を持っています。

私が考えた最初のことは、メンバー関数について考えたとき、200の宣言と200の実装と1つの大きな助けのソースファイルでした。

これらのハンドラですべてのクラスを汚染するのではなく、「ちょうどハンドルです。なぜラムダを使用しないのですか?クラスが構築されると、これらのすべての無名関数をマップに割り当てることができます。仕事やった!

は、それから私は、コンストラクタが巨大になり実現しました。私が考えられるため、サイズに独自のファイルに行くことができる「initializeMap`ヘルパー関数を呼び出すことができます。

皆さんはどう思いますか?

  1. の200件の宣言ファイル、(他の機能の中で)200の実装.cppファイルに.hファイルの
  2. 200宣言、別個「handlers.cpp`実装ファイル
  3. いいえ宣言、CTOR
  4. に割り当てられた200のラムダなし宣言、それ自身のファイルのinitializeMap関数で割り当てられた200のラムダ。

ありがとうございます!

答えて

2

私の意見は、可能であればラムダを使用することです。彼らはずっと保守的です。たとえば、メンバ関数がある場合は、宣言と定義を変更するたびに更新する必要があります。また、その宣言と定義には一意の名前を割り当てる必要があります。ラムダは優れた選択肢です。メンバー変数について自動的にタイプ控除を行うことができれば、メンバー関数を使用することはありません。

+0

私はラムダに向かって傾いています。私は、私のメインクラスが小さなハンドラーを抱えていないという考えが大好きです。だから私は疑問は、それらを割り当てることだと思う - したがって、クラスのコンストラクタ/初期化関数についての質問。 –

+0

3または4、私の個人的な好みは、現代のコンパイラが同時にコンパイルすることができるので、より少ないソースファイルではありますが、実際には関係ありません。 – Puppy

+0

私はかなり同意しますが、確かめたいと思っていました。お返事をありがとうございます。 –

1

本当にこれらの機能を動的にする必要がありますか?あなたの主な関心事がメインクラスを汚染しないようにするだけであれば、サブクラスの作成や、すべてのコードの複数のファイルへの分割など、優れた(より速い)ソリューションがあります。

ヘッダーが200の機能を持ちますが、決して変更されていない場合、ヘッダーはちょうどそこにあるので、プロジェクトを大きく膨らませません。一方、肥大化したコンストラクタは、あなたがいつかそれを変更しなければならない可能性が高いため、さらに200回の初期化をすべて再コンパイルする必要があるため、悪化します。

コンパイル時間はおそらくそれほど長くはありませんが、なぜまったく気にしませんか?

私はそれらの関数をメインクラスや他の専用のクラスやファイルで宣言しておきますが、ctorで動的に宣言しません。

+0

「動的な」データの意味がわからないのですが、コードでデータが入ってきていて、そのコードの適切なハンドラを呼び出す必要があります。したがって、マップには 'std :: function'があります。これがあなたがダイナミックなことを意味していないのであれば、どういう意味ですか? –

+0

私はちょうどラムダ関数を意味しました。私が不明な場合は申し訳ありません。 – Cray

関連する問題