2012-05-14 4 views
1

タイプInternalMessageの個々のオブジェクトを処理し、それぞれをある数のExternalMessageオブジェクトに変換する必要があります(InternalMessagesとExternalMessagesの間に1対多数の関係があります)。ExternalMessage処理されるキュー上のオブジェクト。私はこのキューに2つのモードを挿入したいと思います。つまり、ExternalMessageのすべてがアトミックにキューに挿入され、正常挿入の場合は、ExternalMessageオブジェクトが作成時にキューに挿入されます。このキューのメッセージを生成するスレッドは複数存在することに注意してください。キューに挿入するモードのパターン

これが挿入を処理Inserterオブジェクトを、持っている解決するための私の考え:

class Inserter { 
public: 
    void ProcessMessage(const ExternalMessage& externalMessage) = 0; 
}; 

class SingleInserter { 
public: 
    SingleInserter(Queue* q) : m_q(q) { } 
    void ProcessMessage(const ExternalMessage& externalMessage) { 
     m_q->Insert(q); 
    } 
private: 
    Queue* m_q; 
}; 

class BatchInserter { 
public: 
    BatchInserter(Queue* q) : m_q(q) { } 
    void ProcessMessage(const ExternalMessage& externalMessage) { 
     m_cache.Insert(externalMessage); 
    } 
    ~BatchInserter() { 
     m_q->BatchInsert(m_cache); 
    } 

private: 
    Queue* m_q; 
    List<ExternalMessages> m_cache; 
}; 

とメッセージが作成されると、その後、コールスタックダウンInserterを渡します。

BatchInserter ins; 

または

SingleInserter ins; 

、その後

HandleMessage(someInternalMessage, ins); 

とのhandleMessageを行います:

void HandleMessage(const InternalMessage& msg, Inserter& ins) { 
    //... do logic, eventually create a externalMsg (note - this could be further down 
    //the call stack, in a loop, etc. Multiple external messages could be created each 
    //call to HandleMessage) 
    ins.ProcessMessage(externalMsg); 
} 

は、この設計の理想的ですか?これは、さまざまな挿入型を可能にすることはいいですが、オブジェクトをコールスタックの下に渡さなくても(つまり、テンプレートの特殊化を使用して)行うことができます。第二に、これを実装する際に私が適合しなければならないSTLパターンがありますか?

+0

一時参照は非const参照にバインドされないため、これはうまくいきません。 –

+0

@KerrekSB:それは興味があり、私はそれを知らなかった。私のコードを修正しました。頭がおかげでありがとう。 – mindvirus

答えて

2

私は大丈夫です。私が考えることができる変更はHandleMessageをテンプレートにしているだけです。だからtemplate <class T> HandleMessage(const InternalMessage& msg, T& inserter)になります。これにより、このクラスのユーザーが抽象基本クラスInserterから派生することを強制されることはなく、仮想関数による動的ディスパッチによって引き起こされるわずかなオーバーヘッドを避けることができます。

関連する問題