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

Langage C++ Discussion :

Pointeur sur une fonction membre templatée et +


Sujet :

Langage C++

  1. #1
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut Pointeur sur une fonction membre templatée et +
    Bonjour,

    J'ai comme un problème pour définir un pointeur sur une fonction membre templatée et dont la signature fait intervenir des arguments variadiques.

    Ci-dessous un code simplifié au maximum et qui illustre le problème rencontré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct B {};
    struct A {
      template<typename T, typename... Args>
      bool update(Args&&... args) { }
    };
    Exemple d'usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A a;
    a.update<B>(); // pas de problème
    a.update<B>(3.14); // pas de problème
    Maintenant je voudrais obtenir le fameux pointeur sus-mentionné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // équivalent de a.update<B>();
    bool (A::*f)() = &A::template update<B>; // ok
     
    // équivalent de a.update<B>(3.14);
    // PAS OK:
    bool (A::*f)(double) = &A::template update<B,double>;
    // PAS BON NON PLUS:
    auto f = static_cast<bool (A::*)(double)>(&A::template update<B,double>);
    gcc (4.8) ou clang (3.4) me disent qu'ils ne trouvent pas de matches pour la fonction membre lors de la définition du pointeur f, et que le candidat est bien-sur bool A::update(Args&&... args)

    Si quelqu'un a une idée, je suis preneur. J'ai également essayé avec decltype mais sans succès.
    Merci.

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Bonsoir,

    Avec une rvalue peut-être ?

    bool (A::*f)(double&&) = &A::template update<B,double>;

  3. #3
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Merci jo_link_noir!

    Ca fonctionne! J'avais en tête le fait que Args&& est une universal reference et du coup j'ai complètement négligé ce détail. Bien vu.

    Donc c'est bon dans mon code d'exemple, je peux faire un std::bind une fois obtenu le pointeur.
    Par contre c'est con, mais dans mon code réel qui est un peu plus complexe (la classe A est méchamment templatée par des traits etc), gcc ou clang me sortent des erreurs comme quoi ils ne peuvent inférer le "result type" (j’abrège).
    Ca me rassure que les 2 compilos me sortent une erreur équivalente. Je vais creuser tout ça.

    Merci.

    Edit: Finalement ça fonctionne

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

Discussions similaires

  1. Pointeur sur une fonction membre
    Par pingouin84k dans le forum Débuter
    Réponses: 18
    Dernier message: 30/01/2015, 14h16
  2. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  3. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  4. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  5. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35

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