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.
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. –
@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
L'instanciation du modèle a lieu au moment de la compilation en C++. Il est donc difficile de voir comment cela fonctionnerait. –