Pb de Template

Pb de Template - C++ - Programmation

Marsh Posté le 12-06-2012 à 14:25:25    

Salut à tous,
 
Je bloque sur un truc depuis quelques temps et google ne trouve pas vraiment ce que je veux (ou j'ai mal cherché :) )
Je voudrait faire une fonction templatée qui envoie le contenu d'un std::vector<T> dans un std::ostream.
Sauf que j'aimerai que ça marche à la fois pour les type de base et pour des types persos qui sont dans un autre namespace (disons monnamespace).
Ces types sont des tableaux ou des vecteurs dont je veux connaitre la taille dans ma fonction.
 
Donc finalement je voudrais faire quelque chose comme ça:
 

Code :
  1. template <typename T>
  2. std::ostream& operator<<(std::ostream &out, const std::vector<T> &a)
  3. {
  4. bool montype=false;
  5. std::string type_name=typeid(T).name();
  6. if (type_name.find("monnamespace" )!=std::string::npos) montype=true;
  7. for (typename std::vector<T>::const_iterator i=a.begin(); i!=a.end(); ++i)
  8. {
  9.  switch (montype)
  10.  {
  11.   case 0:
  12.    out<<*i;
  13.    break;
  14.   case 1:
  15.    int size=a[0].dim();
  16.    for (size_t j = 0; j < size; ++j)
  17.     out<<(*i)[j];
  18.    break;
  19.  }
  20. }
  21. return out;
  22. }


 
Mais ça ne marche pas car à la compilation il se rend bien compte que quand j'appelle la fonction sur un vector<double>, il ne peut pas trouver a[0].dim() sur un double ni mettre un indice [j].
Donc est-ce que quelqu'un sait comment faire ça?
Au pire je veux bien faire une fonction pour les std et une autre pour ceux de monnamespace mais je sais pas faire non plus  :( On peut faire en sorte que le template ne s'applique qu'aux types d'un certain namespace?
 
Merci! :)

Reply

Marsh Posté le 12-06-2012 à 14:25:25   

Reply

Marsh Posté le 12-06-2012 à 16:40:38    

euh ..

 
Code :
  1. template<class T, class Alloc>
  2. std::ostream& operator<<( std::ostream& os, const std::vector<T,Alloc>& a )
  3. {
  4.    std::ostream_iterator<std::string> os( std::cout, " " );
  5.    std::copy( a.begin(), a.end(), os );
  6.    return os;
  7. }
 

Ensuite donne un operator<< a ton type dans ton namespace special si besoin mais JAMAIS on ne teste dynamiquement typeid::name()

 


Message édité par Joel F le 12-06-2012 à 16:41:27
Reply

Marsh Posté le 12-06-2012 à 17:12:06    

Il faudra que je me penche sur les allocator un jour ...
Merci, ça m'avance déjà beaucoup! :)
 
Bon par contre, il me reste un souci : je ne veux pas toucher à l'opérateur << des types de mon namespace (ils font déjà autre chose, genre un affichage "joli", tandis que là c'est pour ne récupérer que les nombres sans aucune mise en forme, pour les avoir directement en binaire).
Du coup il faut quand même que j'accède explicitement aux données qu'ils contiennent je pense, non?

Reply

Marsh Posté le 12-06-2012 à 18:24:46    

c'est une mauvaise idée.

 

A ce moment fait un adaptateur ou un iomanip.


Message édité par Joel F le 12-06-2012 à 18:37:17
Reply

Marsh Posté le 12-06-2012 à 21:12:48    

Ah ... ben je vois pas du tout de quoi tu parles ^^
Les adaptateurs, j'en ai jamais entendu parlé et les iomanip je savais pas qu'on pouvait en créer d'autres :)
Je vais me renseigner là dessus.
Tu aurais pas de la doc là dessus par hasard?
 
Merci pour ton aide! :jap:

Reply

Marsh Posté le 12-06-2012 à 22:18:48    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed