0
votes

Existe-t-il un moyen de spécialiser partiellement un modèle avec des packs de paramètres pour une fonction récursive?

J'essaie de faire une fonction d'impression dans C ++ qui prend des nombres variables d'arguments et les imprime chacun de leur propre ligne, comme: xxx

Toutefois, si ty se trouve être un std :: vecteur , je veux le traiter différemment (parce que je veux imprimer tous les éléments du vecteur sur sa propre ligne). J'ai examiné la spécialisation partielle, mais il ne semble pas y avoir grand chose que je pouvais trouver pour le faire avec des paquets de paramètres. Voici ce que j'ai essayé: xxx

Cependant, je reçois une erreur MSVC C2768: " 'println': utilisation illégale d'arguments de modèle explicite " . Toute suggestion ou solutions serait chaleureusement accueillie! Pour référence, j'utilise Visual Studio 2019 Aperçu et sa version correspondante du compilateur.


3 commentaires

Les modèles de fonctions ne peuvent pas être partiellement spécialisés, période. Vous aurez besoin de la magie de type définie par l'utilisateur pour l'effet requis.


@Tanveerbadar CPPRAFERATION SUR SPÉCOFISATION PARTIELLE


Oui, mon point aussi. Vous essayez de le faire pour fonctionner. Ce n'est pas pris en charge.


3 Réponses :


4
votes

Un moyen plus simple serait d'avoir une fonction d'impression et une surcharge que: xxx


0 commentaires

0
votes

Vous ne pouvez pas particulaliser partiellement un modèle de fonction, mais vous pouvez la surcharger. Créez une nouvelle surcharge de println qui prend un std :: vecteur comme premier argument et un pack général comme le reste. Ensuite, faites la manipulation spéciale pour le vecteur argilony et transmettez le reste comme avant. Maintenant, vos vecteurs seront toujours attrapés par la surcharge.


0 commentaires

1
votes

Vous pouvez le faire comme ceci:

/* main.cpp */

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <class T>
void PrintLine(const T &t)
 {
  cout << t << endl ;
 }

template <class T>
void PrintLine(const vector<T> &t)
 {
  for(auto &obj : t ) PrintLine(obj);
 }

template <class ... TT>
void PrintLines(const TT & ... tt)
 {
  ( PrintLine(tt) , ... );
 }

/* main() */

int main()
 {
  vector<string> list{"a","b","c"};

  PrintLines(1,2,3,list);

  return 0;
 }


0 commentaires