[Résolu] Pb de résolution de type dans un template

Pb de résolution de type dans un template [Résolu] - C++ - Programmation

Marsh Posté le 29-05-2010 à 00:01:39    

Je veux faire une fonction qui prends deux containers de même taille et qui rend un container contenant la valeur min entre les deux pour chaque dimension.
 
1 3 5 6 2
3 1 0 8 9
--->
1 1 0 6 2
 
J'ai donc fait une version un peu naïve, mais j'ai un problème concernant la résolution du template de la fonction std::min.
Le "typeof(..)" est pour le moins crade. En effet, c'est spécifique à gcc il me semble.
 

Code :
  1. template<class Container>
  2.   Container minValues(const Container& c1, const Container& c2){
  3.     Container tmp = Container(c1.size());
  4.     std::transform(c1.begin(), c1.end(), c2.begin(), tmp.begin(), std::min<typeof(*(c1.begin()))> );
  5.     return tmp;
  6.   }


 
Comment puis-je faire ça plus proprement (sans typeof en gros) ?
Si je dois absolument ajouter un second argument au template (le type contenu dans le container), y a-t-il une solution pour n'être pas obligé de spécifier explicitement le template à l'appel ?


Message édité par Lan Wezel le 29-05-2010 à 12:47:38
Reply

Marsh Posté le 29-05-2010 à 00:01:39   

Reply

Marsh Posté le 29-05-2010 à 12:32:50    

Si ton Container ets un Container, il doit verifier le concept correspondant et définir un type interne value_type.

 
Code :
  1. template<class Container>
  2.   Container minValues(const Container& c1, const Container& c2){
  3.     Container tmp = Container(c1.size());
  4.     std::transform(c1.begin(), c1.end(), c2.begin(), tmp.begin(), std::min<typename Container::value_type> );
  5.     return tmp;
  6.   }
 

2e solution, un Polymorphic Function Object:

 

http://codepad.org/sJW7FGfg


Message édité par Joel F le 29-05-2010 à 12:33:14
Reply

Marsh Posté le 29-05-2010 à 12:51:27    

Merci, je pense que je vais opter pour la première solution car ce sont en effet de "vrais" conteneurs.
 
Par contre je trouve la seconde solution plutôt élégante, je la garde dans un coin de ma tête. ;-)

Reply

Marsh Posté le 29-05-2010 à 13:24:31    

En fait, je ne sais pas si tu sais pourquoi, mais la première solution ne semble pas tout le temps fonctionner. Ce que je trouve relativement bizarre (j'utilise des std::vector<double> ).  
J'ai une machine sur laquelle les deux solutions fonctionnent et une autre (cluster de calcul) sur laquelle seule la seconde semble être accepté.
 
La première est rejetée à la compil par un <unresolved overloaded function type> pour std::min<typename Container::value_type>
 
Peut-etre la différence vient-elle de la config de gcc, voire de la version (4.4.1 sur l'un et 4.3.4 sur l'autre) ?


Message édité par Lan Wezel le 29-05-2010 à 13:29:04
Reply

Marsh Posté le 29-05-2010 à 13:49:59    

on ne peut pas passer de fonction template en objet fonction dans certains GCC. Je te conseille la 2e solution ;)

Reply

Sujets relatifs:

Leave a Replay

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