10
votes

Transmettre des références aux modèles variadiques

Je travaille sur une bibliothèque d'événements et je suis confronté à un problème avec des modèles variadiques.

Tout fonctionne très bien, sauf le fait que je ne peux pas passer des références comme paramètres ... < p> Voici un exemple très simplifié écrit pour exposer mon problème. xxx

comme je l'enregistre toutes les instances de retardedsignal dans une seule instance STD :: Liste Je souhaiterais éviter d'utiliser des gabarits Sur la classe elle-même, et c'est pourquoi j'utilise plutôt des modèles sur les constructeurs. Je pourrais également utiliser une classe virtuelle pure comme base pour tous les pointeurs de retardedsignal et enregistrer la classe virtuelle dans la liste des STD :: Liste mais je pense qu'il est préférable de minimiser l'utilisation de méthodes virtuelles et je suis vraiment intrigué par ce problème ...

Comme vous pouvez le constater dans cet exemple, Test02 et Test04 Erreurs de retour si elles sont activées. Retardedsignal_debugghelper est presque identique à retardedsignal, à l'exception du fait qu'il utilise argsbis (argument de modèle de classe) sur le dernier constructeur au lieu du modèle ARGS (l'argument de modèle de méthode), sinon cela ne fonctionne pas (comme avec DelayedSignal). Args est accepté sur le void (c :: * func) (args ...) mais n'est pas avec argsbis ... args dispirez le fait qu'ils sont dans le même Déclaration du constructeur.

Autant que je sache, il n'y a pas de problème sans références ( retardedsignal test04 (& signal :: feu, signal_01, k); par exemple ) Ou avec plusieurs paramètres (ou aucun) tant qu'il n'y a pas de références.

est là quand même résoudre ce problème?

Merci.


5 commentaires

@Valke ne devriez-vous pas baliser cela avec C ++ 0x? J'ai essayé de compiler votre solution et je me demandais pourquoi cela ne fonctionnait pas dans Visual Studio 2011; Après avoir levé des modèles variadiques, je viens de réaliser que si la recherche est correcte, c'est une nouvelle fonctionnalité. Quels compilateurs soutiennent réellement cela quand même?


@LEET: tag Ajoutée. Cette fonctionnalité a été prise en charge par g ++ depuis la version 4.3 - voir ce lien pour plus d'informations: GCC.GNOU .org / Projets / CXX0X.HTML


@Ben VoigT: J'utilise GCC 4.5.0


@leetightShade: Oh désolé, oui je le compile en utilisant c ++ 0x.


@Tonyk: Merci d'avoir ajouté la balise.


3 Réponses :


2
votes

J'utilise Clang qui donne un message d'erreur absolument fabuleux: xxx

Le compilateur déduit des types de conflit pour args :

  1. std :: string &
  2. std :: chaîne

    Je crois que la meilleure façon de résoudre ce problème est exactement la manière dont vous l'avez fait avec votre retardedsignal_debugghelper .


1 commentaires

Bonjour, très intéressant et ... étrange. Mon message d'erreur est moins descriptif: Main.CPP: 2: 74: Erreur: Aucune fonction de correspondance pour appeler à 'RetardseDsignal :: DeleDeDsignal (NOID (SIGNAL &)> :: *) (STD :: BASIC_STRIN G &), SIGNAL &)> &, STD :: STRING &) 'MAIN.CPP: 57: 1: Remarque: le candidat est: Retardedsignal :: retardedsignal (const retardedsignal &) mais on dirait que vous avez raison sur les types contradictoires. Je ne suis pas difficile de ça ... je suppose que je devrai changer mon moyen de mettre en œuvre les retardataires. Merci de votre aide.



1
votes

Howard Hinnant a raison ... L'autre possibilité que vous avez est d'utiliser des références partout, par exemple: xxx


1 commentaires

Cette solution résout au moins partiellement mon problème. Les deux réponses sont valables, mais comme je ne peux en choisir qu'un seul d'entre eux, j'ai sélectionné celui avec une solution partielle.



1
votes

Comme vous avez accepté une réponse, il s'agit simplement d'une supplémentation. Bien que je puisse négliger quelque chose, identité modèle de classe comme le SIGHIPE SEULEMENT DE FAIRE CODE COMPILABLE.
Par exemple: xxx

voici un Test sur Ideone < / p>


0 commentaires