2016-05-21 1 views
1

Je souhaite utiliser FuncType comme type de paramètre de la fonction foo. Est-ce que l'épargne soutient cela? Comment définir le type à l'intérieur FuncType?Est-ce que apache thrift supporte la fonction variable comme paramètre?

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

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

Comment cela fonctionnerait-il? Que se passerait-il si l'appelé invoquait la fonction? –

+0

Copie possible de [Callbacks dans Thrift Asynchronous Functions?] (Http://stackoverflow.com/questions/2554999/callbacks-in-thrift-asynchronous-functions) – JensG

Répondre

1

Apache Thrift a été conçu pour permettre des appels RPC entre les différentes plates-formes et environnements. Donc passer quelque chose comme std::function<int(int)> ne peut tout simplement pas être supporté: comment la fonction native définie en C++ pourrait-elle être transférée en JavaScript et vice versa?

(BTW: même si c'était en quelque sorte possible, c'est généralement une mauvaise idée, pour permettre aux utilisateurs du serveur d'injecter du code dans ii - pour des raisons de sécurité).

Si vous voulez une fonction unique avec plusieurs options de traitement - créez une énumération et transmettez-la à cette fonction. Mieux encore - définissez plusieurs fonctions dans votre service. Si vous voulez vraiment permettre à l'utilisateur de traiter échantillon par échantillon: soit renvoyer tous les échantillons à l'utilisateur et les traiter en conséquence dans le client, soit, s'il y a trop de données à transmettre par réseau, fournir le service "itérateur":

struct MyPair { 
    i32 first; 
    i32 second; 
} 

typedef i32 QueryId; 

service MyService { 
    QueryId startProcessing(); 
    MyPair getNextSample(1: QueryId id); 
}