Поддерживает ли apache thrift функциональную переменную в качестве параметра?

Я хочу использовать FuncType в качестве типа параметра функции foo. Поддерживает ли это бережливость? Как определить тип внутри FuncType?

struct FuncType {
  // std::function<std::vector<std::pair<int, int>>(const std::string &)>;
  // how to define here?
}

service WorkerService {
  bool foo(1:FuncType func)
}

person xunzhang    schedule 21.05.2016    source источник
comment
Как это будет работать? Что произойдет, если вызываемый вызов вызовет функцию?   -  person Alan Stokes    schedule 21.05.2016
comment
Возможный дубликат обратных вызовов в асинхронных функциях Thrift?   -  person JensG    schedule 23.05.2016


Ответы (1)


Apache Thrift был разработан, чтобы разрешить вызовы RPC между различными платформами и средами. Таким образом, передача чего-то вроде std::function<int(int)> просто не может поддерживаться: как нативная функция, определенная в C++, может быть передана в JavaScript и наоборот?

(Кстати: даже если бы это было как-то возможно, это, как правило, плохая идея, позволять пользователям сервера вводить некоторый код во ii - из соображений безопасности).

Если вам нужна одна функция с несколькими вариантами обработки - создайте какое-нибудь перечисление и передайте его этой функции. Еще лучше — определите несколько функций в своем сервисе. Если вы действительно хотите разрешить пользователю обрабатывать образец за образцом: либо верните все образцы пользователю и обработайте их соответствующим образом в клиенте, либо, если слишком много данных для одновременной передачи по сети, предоставьте услугу «итератор»:

struct MyPair {
   i32 first;
   i32 second;
}

typedef i32 QueryId;

service MyService {
  QueryId startProcessing();
  MyPair getNextSample(1: QueryId id);
}
person Hcorg    schedule 24.05.2016