2016-05-21 1 views
0

Je veux traiter à distance appelez un modèle de fonction C++ en utilisant l'épargne, est-ce que le support d'épargne cela?Est-ce que l'IDL d'épargne prend en charge les types génériques en C++?

Si c'est le cas, comment puis-je écrire un fichier de description d'épargne dans ce cas?

+1

Les fonctions de modèle ne sont pas appelables. Ils sont juste un moyen d'éradiquer le code. Vous devrez instancier explicitement la fonction modèle dans C++, puis l'exporter. –

+0

@RichardCritten, raisonnable, mais en écrivant un cadre en utilisant thrift pour l'utilisation rpc, je veux fournir des fonctionnalités de modèle et de fournir une instanciation aux utilisateurs. – xunzhang

+0

L'instanciation du modèle a lieu au moment de la compilation en C++. Il est donc difficile de voir comment cela fonctionnerait. –

Répondre

0

Les modèles en C++ sont instanciés avec des types lors de la compilation, donc il n'y a aucun moyen de permettre à l'utilisateur de fournir MyOwnType pendant l'exécution. Cela nécessiterait une recompilation et un rechargement étranges de certaines parties du code pendant l'exécution du code ...

C'est pourquoi il n'est généralement pas pris en charge pour fournir à l'utilisateur la possibilité d'instancier un modèle côté serveur.

Autre mode - Thrift a été conçu pour prendre en charge la communication multiplate-forme. Imaginez un client PHP essayant d'instancier un template C++ avec une classe définie en PHP ...

Aussi - souvenez-vous des problèmes de sécurité - passez tout code à exécuter côté serveur (l'instanciation du template est en fait une forme d'exécution de code) sans la vérification est juste une mauvaise idée.

Dans Thrift, vous pouvez utiliser le vector générique ou le map pour définir des types spécifiques, mais les fonctions doivent être spécifiques et non génériques.

Vous pouvez définir autant de fonctions que vous le souhaitez avec tous les types que vous voulez prendre en charge. Vous pourriez même envisager de créer un script générant Thrift IDL à partir de la liste des types que vous voulez prendre en charge.

Ou vous pouvez utiliser Thrift union de type ou optional champs pour créer un type « variante »:

union Arg { 
    1: optional Type1 t1; // not sure if union works well enough... 
    2: optional Type2 t2; 
} 

void genericFun(1: Arg a); 

à mon humble avis: Ce qui semble comme vous voulez créer un type de serveur « faire de tout », ce qui est rarement un bonne idée - choisissez ce que votre serveur vraiment a à faire et le faire bien.