2010-01-18 4 views
0

En supposant une instanciation correcte dans le commentaire indiqué, l'expression suivante est-elle légale et portable C++? Pourquoi ou pourquoi pas?Portabilité de l'expression std :: mem_fun

std::mem_fun</*…*/>(&(std::vector<int>::clear)) 
+1

Copié à partir du livre de Herb Sutter? Partie 1, Chapitre 4 De C++ Exceptionnel - 47 Puzzles d'ingénierie, problèmes de programmation et solutions :) – coelhudo

+0

@coelhudo: Cela pourrait provenir de ce livre, mais quelqu'un m'a demandé cela et je n'ai pas été capable de répondre. Alors pensé à demander ici. Sans vouloir vous offenser :-) –

Répondre

3

Comme il est écrit, avec un ensemble vide de paramètres de modèle, non. Vous devez soit donner les paramètres corrects, soit les omettre complètement pour les déduire de l'argument.

Donc, ce qui est légal:

std::mem_fun(&std::vector<int>::clear) 

et est donc ceci:

std::mem_fun<void,std::vector<int> >(&std::vector<int>::clear) 

Les deux donnent un objet de fonction avec un opérateur d'appel de fonction qui prend un pointeur vers une std::vector<int> et appelle clear sur elle .

Modifier: Comme le mentionne UncleBens, les parenthèses entourant le nom de la fonction sont en fait illégales, donc je les ai supprimées de ma réponse.

1

Il est parfaitement légal et portable. Rappelez-vous seulement que sur différentes plates-formes/compilateurs int peut être de taille différente. En outre, la version de paramètre explicite est rarement utilisée, laissez le compilateur en déduire le type lui-même.

0

No:

"ComeauTest.c", line 7: error: nonstandard form for taking the address of a member 
      function 
     std::mem_fun(&(std::vector<int>::clear)); 
       ^

Laissez tomber les parenthèses supplémentaires.

En général, je pense que le seul but de std::mem_fun est de déduire les paramètres de modèle pour vous et choisir d'utiliser soit mem_fun_t, mem_fun1_t, const_mem_fun_t ou const_mem_fun1_t, donc on ne sait pas pourquoi vous devriez jamais vouloir spécifier les paramètres de modèle pour mem_fun explicitement . Mais naturellement, cela est autorisé, comme avec tout autre modèle de fonction.

0

Réponse courte: "Certains compilateurs populaires no." (d'Exceptional C++) (je suppose qu'il parle de GCC ou du compilateur Microsoft C++).

La réponse longue est détaillée here. Je ne sais pas si la réponse est toujours valable pour les versions actuelles des compilateurs, car ce post a été publié en 2004 avec le livre. Je vous recommande fortement de lire le gourou de la semaine (gotw.ca), il y a beaucoup de choses intéressantes/amusantes/curieuses là-bas.

Questions connexes