タイプ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パターンがありますか?
一時参照は非const参照にバインドされないため、これはうまくいきません。 –
@KerrekSB:それは興味があり、私はそれを知らなかった。私のコードを修正しました。頭がおかげでありがとう。 – mindvirus