IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

(visual studio,c++ natif) operator ()?


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut (visual studio,c++ natif) operator ()?
    bonjour,

    en lisant un livre je suis tombé sur ce morceau de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public:
        void operator() (const blocked_range<size_t> & r)const{
        ...}
    savez-vous de quel opérateur il s'agit?

    olivier.

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    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?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    De l'opérateur()
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    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é.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    struct less
    {
        bool operator(T a, Tb){return a<b;}
    };
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
        }
    };
    et qui pourrait être utilisé sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }
    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

    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)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    merci, c'était très clair.

    olivier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accès natif et Visual Studio
    Par YF21_Valkyrie dans le forum Informix
    Réponses: 6
    Dernier message: 15/02/2012, 09h33
  2. News Visual Studio
    Par farscape dans le forum Visual C++
    Réponses: 34
    Dernier message: 27/04/2010, 10h21
  3. Réponses: 1
    Dernier message: 29/02/2008, 13h12
  4. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33
  5. Version de Windows dans Visual Studio !!!
    Par Jasmine dans le forum MFC
    Réponses: 3
    Dernier message: 18/03/2004, 17h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo