1

テンプレート パラメーターとしてデータ型を受け取る Node クラス テンプレートがあります。

template <class T_Data>
class Node
{
};

Node クラスは、いくつかのイベントでユーザー/リスナーに通知できます。この機能はシグナルを使用して実装されますlibsigc++が、シグナルが発信される前に、ノードはハンドラー オブジェクトに通知し、処理を行い、シグナルを発信するかどうかを決定します。このハンドラ オブジェクトが存在するのは、場合によっては、ノード オブジェクトで oen イベントを処理してシグナルをブロックする必要があるためです。

一般的な解決策は、派生クラスで誰でもオーバーライドできる Node 仮想メソッドを提供することですが、Node はそれ自体への参照を使用し、独自の型のオブジェクトを作成するため、HandlerBase クラスを用意して、人々にハンドラーを派生させる方が簡単です。

ハンドラークラスを作成し、ノードでそれを使用するまで、すべてがうまくいきました。しかし、新しいハンドラーを有効にするには、静的 Node メソッドを呼び出す必要がありますNode::set_event_handler()。それは私がどこかでそれを呼び出すことを覚えておく必要があることを意味します. 誰かが私のハンドラーを使用したい場合は、main() またはいくつかのメイン クラスの ctor、おそらく GUI アプリの Window クラスにハンドラーを設定することを忘れないでください。

template <class T_Data>
class Node
{
public:
     static void set_event_handler (std::unique_ptr <HandlerBase> new_handler);
private:
     static std::unique_ptr <HandlerBase> event_handler;
};

そこで、考えられる解決策を 2 つ思いつきました。

  1. set_handler()私が持っているいくつかのメインクラスに呼び出しを入れます
  2. Node クラスに T_Handler テンプレート パラメーターを追加します。

現在、静的ハンドラ フィールドは、すべてのシグナルを無視する新しい HandlerBase に設定されています。テンプレート パラメーターを使用すると、異なるハンドラーで同じデータ型を持つことが可能になり、初期化で静的フィールドが設定されるため、余分な作業は必要ありません。

問題は、T_Handler が Node に「クラッタ」を追加するだけでなく、多くの Node ユーザーが必要としない、ハンドラ タイプのためだけにテンプレート パラメータを追加するという意味で「クリーン」ではないかどうかです。

実際には、T_Handler にデフォルト値を与えることもできるので、ユーザーはそれを忘れることができます。

4

1 に答える 1

1

もちろん、それは混乱を招き、きれいではなくなります。しかし、それは本当に大きな懸念事項ですか?それはあなたの見方次第だと思います。

標準ライブラリの多くのテンプレートを見ると、ほとんどのユーザーが必要としないテンプレート パラメーターが表示されます。typedefこの乱雑さを隠すために、デフォルト値と同様に使用されます。たとえば、std::basic_stringを参照してください。

  • traitsほとんどのユーザーはまたはを気にしないAllocため、これらのパラメーターにはデフォルト値があります
  • isの一般的な値charTは単に ischarであるため、std::string型は短縮形として定義されています。

この乱雑さは隠されているだけであることに注意してください。コードをデバッグする必要があり、デバッガーで変数の型を見ている場合、それはあなたを噛むことになるでしょう。;)

于 2013-05-03T16:52:34.387 に答える