См this thread и соответствующие example. Предложение заключается в том, чтобы добавить параметр bool
к CallData
(hello_
в данном примере), два экземпляра CallData
объектов, один с hello_ = true
, и один с hello_ = false
, и имеют каждый один запрос на другую RPC.
if (hello_) {
service_->RequestSayHello(...);
} else {
service_->RequestSayBye(...);
}
Для более двух типов вызовов, вы можете достичь того же поведения с enum
вместо bool
.
Более гибкий подход состоял бы в том, чтобы иметь для каждого RPC другой класс CallData
-like . Однако, когда вы получаете тег от cq_->Next()
, вы знаете, что это указатель на объект одного из этих классов, но вы не знаете его точного типа. Чтобы преодолеть это, вы можете иметь их все наследоваться от класса с виртуальной функцией 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();
...