Variadic templates
J'ai vu beaucoup de liens à l'introduction de la variadic templates. Mais je n'ai jamais vu un compilable exemple qui illustre cette approche.
Quelqu'un pourrait-il me fournir quelques liens dans lesquels de tels compilable exemples peuvent être trouvés?
Qu'entendez-vous par "compilable exemple"? Je pense que tous ces liens introduit des exemples qui peuvent être compilés.
non, ce n'est pas le cas. Ces exemples décrivent uniquement la décélération de ces veriadic temlates peut-être la définition trop, mais jamais à l'appel, en cas de variadic fonction, ou instancier certains variadic classes dans la fonction principale. J'ai besoin en fait qu'un simple exemple qui, je peux le copier et de le compiler pour mieux comprendre les variadic mécanisme..
Êtes-vous sûr que vous êtes en utilisant un compilateur qui prend en charge ce et de l'appeler avec les options correctes?
En fait, je voulais simplement dire que j'ai besoin de quelques exemples de les compiler. Je sais que le drapeau de compilation -std=c++0x doit être définie. Cependant, tous les exemples que j'ai trouvé sont printf comme. J'ai besoin d'une petite mais significative exemple..
non, ce n'est pas le cas. Ces exemples décrivent uniquement la décélération de ces veriadic temlates peut-être la définition trop, mais jamais à l'appel, en cas de variadic fonction, ou instancier certains variadic classes dans la fonction principale. J'ai besoin en fait qu'un simple exemple qui, je peux le copier et de le compiler pour mieux comprendre les variadic mécanisme..
Êtes-vous sûr que vous êtes en utilisant un compilateur qui prend en charge ce et de l'appeler avec les options correctes?
En fait, je voulais simplement dire que j'ai besoin de quelques exemples de les compiler. Je sais que le drapeau de compilation -std=c++0x doit être définie. Cependant, tous les exemples que j'ai trouvé sont printf comme. J'ai besoin d'une petite mais significative exemple..
OriginalL'auteur sami | 2010-09-03
Vous devez vous connecter pour publier un commentaire.
Variadic templates sont une partie du C++0x standard qui n'est pas encore officiellement sorti. Ils sont pris en charge par la gcc depuis la version 4.3, mais vous devez activer le support de C++0x en ajoutant le commutateur de compilateur -std=c++0x.
pas de Compilateur de Microsoft ne le supporte pas et ils en ont besoin.
Ils ont annoncé quelques fonctionnalités qui seront dans MSVC11 (en 2012), et les Variadic Templates n'était pas sur cette liste. Le temps pour moi d'apprendre à installer MinGW.
Je suis totalement ne comprends pas pourquoi ce est la réponse...
il se plaignait qu'il n'est pas compilable exemple. Il y a des tonnes d'exemples - la seule raison pour laquelle ils n'ont pas de compilation sont: manquant de prise en charge du compilateur ou manquant de commutateur de compilateur
OriginalL'auteur David Feurle
L'un de la plus simple possible des exemples est la suite de la mise en œuvre de
max
qui n'est même pas basée sur des modèles types.Seulement un peu plus complexe est de la forme canonique
printf
mise en œuvre:...
aprèsArgs
etargs
juste syntaxique de sel, ou il y a aussi des façons dans lequel des paramètres variants. peut être utilisé sans le...
?Le placement de
...
questions. Considérons deux variadic template fonctionssum
etproduct
. Maintenant les appeler à partir d'une autre variadic template avec des paramètres2,3,4
la valeur deproduct(sum(args...))
sera de 9 et de la valeur deproduct(sum(args)...)
sera 24.J'ai développé ce thème légèrement en blog
la ligne
printf(s, args...);
dire récursive runtime appel à une autre fonction compilé avec 1 de moins argument ou le compilateur de manière récursive développer cette ligne de corps de printf avec 1 de moins argument?il n'est pas techniquement la récursivité, le compilateur instancie une nouvelle surcharge de
printf
avec moins de paramètres et ajoute un appel à cette fonction. Cet appel de fonction peut, ou ne peut pas, être incorporé mais c'est hors de propos.OriginalL'auteur Motti
Variadic templates sont une C++0x fonctionnalité qui cible principalement les auteurs du générique de bibliothèques. Je ne m'attends pas à les voir dans le "code d'utilisateur". Par exemple, dans le C++0x bibliothèque standard, ils sont utilisés dans beaucoup d'endroits: std::function, std::asynchrone, std::reference_wrapper, std::tuple, std::packaged_task, ...
Pour vous donner un exemple, je vais vous montrer comment un reference_wrapper pourrait être mise en œuvre à l'égard de variadic templates:
Ce n'est pas parfaitement conforme au projet de norme, mais il est censé être compilable avec peu de modifications. Il démontre plusieurs C++0x caractéristiques:
decltype
declval
de créer des objets dans le but de construire une expression pourdecltype
(GCC n'offre pas encore ce modèle de fonction. Vous devez écrire vous-même)Le but de la variadic membre de modèle est d'avancer des arguments à l'objet visé par
ptr
. Cela devrait fonctionner dans le cas où T est un pointeur de fonction type ou d'un type de classe avec fonction surchargée d'appel de l'opérateur.cheers!
s
OriginalL'auteur sellibitze
OriginalL'auteur phadej
Un exemple très simple de variadic template:
Supposons que nous voulons avoir une fonction qui prend un nombre variable d'arguments et de les imprimer tous. Ex:
Pour que cette fonctionnalité fonctionne, il serait fondamentalement besoin de deux fonctions:
Première, une fonction qui prend un nombre variable d'arguments:
Quelques explications:
1.) Paramètre Packs indiqué par des points de suspension(...), qui apparaissent dans la liste des paramètres.
Cela signifie que, ces tous sont les mêmes.
Donc, vous n'avez pas à vous soucier de la position correcte de l'espace. Cependant, l'OMI, au plus les espaces doivent être utilisés en tant que meilleure pratique.
2.) Pack d'Extension: Une tendance suivie par des points de suspension.
3.) Paramètre pack accepte zéro ou plus modèle args. Donc,
print(T t, Args... args)
accepte un ou plusieurs args.Une fois que vous comprenez que, nous pouvons visualiser le flux d'appels en tant que ci-dessous:
se traduit par:
qui appelle
qui appelle
qui appelle
qui appelle
Si vous avez suivi le Point#3 avec soin, vous devez avoir réalisé que
print(T t, Args... args)
ne peut pas gérer l'appel au Niveau 0.Nous avons donc besoin d'une autre fonction ici avec le même nom de le rattraper à n'importe quel niveau >=0.
Second, une fonction de saisir à l'appel du haut de la pile des appels:
Attraper au niveau 0:
ou, Attraper au niveau 1:
ou, Attraper au niveau 2:
etc...
Aucun de ces travaux. Espérons que cela aide à vous la prochaine fois que vous allez au sujet de l'écriture de cette fonction ou de la classe.
OriginalL'auteur Saurav Sahu
Ceci est un exemple de variadic templates que j'ai mis sur mon blog:
http://thenewcpp.wordpress.com/2011/11/23/variadic-templates-part-1-2/
Il compile. Il démontre trouver le plus grand type à partir d'un groupe de types.
Peut-être dans certains cas. Mais vous ne pouvez même pas le faire en C, il n'est donc pas vraiment comparable.
OriginalL'auteur Jarryd
Avant C++11, vous pouvez créer un modèle uniquement avec le fixe nombre de paramètres.
Évolution du modèle de la fonction avec un paramètre.
Deuxième modèle pour la fonction à deux paramètres.
... c'est à dire
Depuis C++11, vous pouvez écrire un seul modèle, le compilateur va générer, conformément à la fonction elle-même.
Bon exemple
http://eli.thegreenplace.net/2014/variadic-templates-in-c/
OriginalL'auteur Sergey
une autre syntaxe: l'expansion, par exemple
donc:
est maintenant fait:
OriginalL'auteur Erez