RE-bonjour et merci de ces réponses, il cartonne toujours autant ce forum
Je vais répondre aux trois :
@MatRem :
Je connais la syntaxe de définition des instances, les 4 que tu as données en exemple me vont très bien (ouf )
J'avais aussi pigé pour l'histoire du pointeur de fonction libre (j'avais fait un tour du côté des callbacks auparant).
Dans ta réponse donc, pour la chose suivante :
std::sort(v.begin(), v.end(), SortByNumber());
Cela semble rejoindre ma première intuition : la structure n'ayant pas de constructeur il lui en est attribué un par défaut et donc SortByNumber() réclame bien la construction d'un objet temporaire qui sera alors passé par référence constante, objet foncteur puisque son operator() est redéfinit. C'est bien ça ?
@Oussapik :
Nope pas très clair, mais l'approche des vacances demain cumulé avec mon endormissement du jour ne m'aide pas
std::set<A, SortByString> s;
Cette ligne semble déclarer un objet template pour les types A et SortByString, ça rejoint ce que tu dis je crois ?!
@koala01
Merci d'abord pour la réponse très détaillée !
Par contre, pour sort, il faut passer une instance valide du foncteur.
<-- Là oui, ça rejoint ce que disait MatRem.
Effectivement, j'ai eu tendance à créer des objets directement dans l'appel de fonctions/méthodes mais ça ne plaisait pas à certains collègues qui ne trouvent pas ça lisible. Perso je trouve ça clair et ça évite de se traîner une variable qui ne sert qu'une ou deux fois.
Ton exemple de code est très clair aussi pour le paramètre que ça fait intervenir, j'allais justement poser la question.
A la base, j'ai eu un doute quant au fait que
std::sort(v.begin(), v.end(), SortByNumber());
passé en paramètre appelait non pas le constructeur mais l'opérateur () de SortByNumber. Je me demandais comment cela était possible puisque la "méthode bool operator() /*...*/" n'était pas statique et donc pas moyen de s'y référer. Je m'étais dit que c'était quand même plus clair de l'expliciter de la manière suivante
std::sort(v.begin(), v.end(), SortByNumber.operator());
mais là encore, ça aurait été magique puisque ce n'est pas statique(1).
Je suppose donc que le code de la fonction sort se charge d'appeler l'opérator() de l'objet passé en paramètre en lui filant les références vers les objets à trier.
(1) : J'entends la chose suivante par méthode statique de l'operator() si jamais cela était possible mais il me semble pas que ça se fasse avec des opérateurs :
1 2 3 4 5 6 7
| struct SortByNumber
{
static bool operator ()( const A & a1, const A & a2 ) const
{
return a1.Number < a2.Number;
}
}; |
et donc dans ce cas
std::sort(v.begin(), v.end(), SortByNumber.operator());
pourrait peut-être marcher.
Bref, je laisse ouvert le topic encore un peu avant de le passer en résolu.
Partager