はthis threadと 関連 exampleを参照してください。 提案は、( この例でhello_
)CallData
にbool
パラメータを追加2つのCallData
オブジェクト、hello_ = true
有するもの、及びhello_ = false
とのいずれかをインスタンス化し、それぞれの要求に 異なるRPCを有することです。
if (hello_) {
service_->RequestSayHello(...);
} else {
service_->RequestSayBye(...);
}
呼び出し2種類以上の場合、あなたはenum
の代わりbool
と同じ動作 を達成することができました。
より柔軟なアプローチは、RPCごとに異なるCallData
のような クラスを持つことです。しかし、cq_->Next()
からタグを取得した場合、 は、それがこれらのクラスのオブジェクトの1つのオブジェクトへのポインタであることを認識していますが、 はその正確な型を認識していません。これを克服するために、各サブクラスでは、必要に応じて、あなたがそれらを仮想Proceed()
メンバ関数を持つクラスからのすべての 継承を持つことができ、 はそれを実装し、タグを取得するときに、CallData
として それをキャストしProceed()
を呼び出します。
class CallData {
public:
virtual void Proceed() = 0;
};
class HelloCallData final : public CallData {...};
class ByeCallData final : public CallData {...};
...
new HelloCallData(...);
new ByeCallData(...);
cq_->Next(&tag, &ok);
static_cast<CallData*>(tag)->Proceed();
...