bonjour,
en lisant un livre je suis tombé sur ce morceau de code :
savez-vous de quel opérateur il s'agit?Code:
1
2
3
4 public: void operator() (const blocked_range<size_t> & r)const{ ...}
olivier.
Version imprimable
bonjour,
en lisant un livre je suis tombé sur ce morceau de code :
savez-vous de quel opérateur il s'agit?Code:
1
2
3
4 public: void operator() (const blocked_range<size_t> & r)const{ ...}
olivier.
Bas c'est l'opérateur () qui est surchargé ici. Le blocked_range<> me fait dire que le code utilise TBB.
Comme la classe surcharge l'opérateur () c'est donc un foncteur.
Donc plus loin on doit l'utiliser dans un parrallel_for(blocked_range<> t, leFoncteur) non?
De l'opérateur() :mrgreen:
Les anglophones l'appellent le "function call operator", et je ne connais pas l'équivalent français officiel, peut être "l'opérateur d'appel de fonction"
C'est un opérateur très pratique car il permet de donner à une structure ou une classe une sémantique de fonction.
Par exemple :
m(1,2) ressemble à un appel de fonction (une fonction dont la signature serait void m(int, int) ) mais en fait c'est l'opérateur() de Matrix qui est appellé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class Matrix() { public: Matrix(int numLignes, int numColonnes): numLignes_(numLignes), numColonnes_(numColonnes), data_(new float[numLignes * numColonnes]) { // met à zéro la matrice std::fill(data, data + numLignes * numColonnes, 0.0f) } float operator() (int x, int y) const { return data[ y * numColonne + x]; } private: int numLignes_, numColonnes_; float* data_; } Matrix m(3,3); // construit une matrice 3x3 cout << m(1, 2);
Salut,
L'opérateur parenthèse permet de créer ce que l'on appelle un foncteur.
Pour faire simple (et donc en étant par nature inexact et imprécis), un foncteur va permettre d'appeler un comportement particulier d'une classe, ce qui est souvent très intéressant dans le cadre d'une programmation générique.
Un foncteur peut, selon les cas, et de manière non exhaustive, servir:
- d'opérateur de conversion explicite
- de moyen de comparaison (on parle alors de prédicat)
- à appeler finalement n'importe quel comportement particulier nécessitant, ou non la présence d'argument
Ainsi, le standard déclare un foncteur nommé less compare deux élément et renvoie vrai si le premier élément est plus petit que le deuxième, et implémenté sous la forme de
Mais tu pourrais envisager d'écrire un foncteur qui serve à convertir explicitement un entier en une chaine de caractères, et qui pourrait ressembler àCode:
1
2
3
4
5 template<typename T> struct less { bool operator(T a, Tb){return a<b;} };
et qui pourrait être utilisé sous une forme proche deCode:
1
2
3
4
5
6
7
8
9
10 struct MyStruct { int i_; std::string operator()() { std::stringstream ss; ss<<"le nombre en question est " <<i_; return ss.str(); } };
Dans l'exemple que tu donnes, il semblerait que l'opérateur permette surtout de forcer un comportement particulier de la classe en vue de lui faire accepter un argument particulier ;)Code:
1
2
3
4
5
6
7
8 int main() { MyStruct s; s.i_=3; std::string str=s(); std::cout<<str<<std::endl; return 0; }
Tu trouvera des explications sur le sujet dans l'entrée de la FAQ correspondante(l'entrée suivante s'intéressant particulièrement aux prédicats)
merci, c'était très clair.
olivier.