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 :

Comment passer des références à un tuple ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comment passer des références à un tuple ?
    Salut, je voudrais passer des références à un tuple, faire un genre à ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    odfaeg::FastDelegate<void> freeFunction(&bar, std::ref("5"));

    Pour la passer ici :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     template <typename ...A> FastDelegate(void(*f)(A...), A... args) {
            delegate = new FastDelegate0<A...>(f, args...);
        }

    Et puis là :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FastDelegate0 (void(*f)(A...), A... args) {
          typedef void(*CB)(Function<void(A...)>, A... args);
          CB cb = &callback;
          funct = new Functor<void(Function<void(A...)>, A...)> (cb, Function<void(A...)>(f));
          params = std::make_tuple(args...);
    }

    Mais le compilateur me sors une erreur :

    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
    26
    27
    28
     
    ||=== Build: Debug in ODFAEG-DEMO (compiler: GNU GCC Compiler) ===|
    /usr/include/c++/4.8/tuple||In instantiation of ‘constexpr std::_Head_base<_Idx, _Head, false>::_Head_base() [with long unsigned int _Idx = 0ul; _Head = std::reference_wrapper<const char [2]>]’:|
    /usr/include/c++/4.8/tuple|251|required from ‘constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl() [with long unsigned int _Idx = 0ul; _Head = std::reference_wrapper<const char [2]>; _Tail = {}]’|
    /usr/include/c++/4.8/tuple|394|required from ‘constexpr std::tuple< <template-parameter-1-1> >::tuple() [with _Elements = {std::reference_wrapper<const char [2]>}]’|
    /usr/local/include/odfaeg/Core/fastDelegate.h|69|required from ‘odfaeg::FastDelegate6<F, A>::FastDelegate6(F, A ...) [with F = void (*)(const std::basic_string<char>&); A = {std::reference_wrapper<const char [2]>}]’|
    /usr/local/include/odfaeg/Core/fastDelegate.h|435|required from ‘odfaeg::FastDelegate<void>::FastDelegate(F, A ...) [with F = void (*)(const std::basic_string<char>&); A = {std::reference_wrapper<const char [2]>}]’|
    /home/laurent/Développement/Projets-c++/ODFAEG-DEMO/main.cpp|67|required from here|
    /usr/include/c++/4.8/tuple|131|error: no matching function for call to ‘std::reference_wrapper<const char [2]>::reference_wrapper()’|
    /usr/include/c++/4.8/tuple|131|note: candidates are:|
    /usr/include/c++/4.8/functional|445|note: std::reference_wrapper<_Tp>::reference_wrapper(const std::reference_wrapper<_Tp>&) [with _Tp = const char [2]]|
    /usr/include/c++/4.8/functional|445|note:   candidate expects 1 argument, 0 provided|
    /usr/include/c++/4.8/functional|439|note: std::reference_wrapper<_Tp>::reference_wrapper(_Tp&) [with _Tp = const char [2]]|
    /usr/include/c++/4.8/functional|439|note:   candidate expects 1 argument, 0 provided|
    /usr/include/c++/4.8/tuple||In instantiation of ‘constexpr std::_Head_base<_Idx, _Head, false>::_Head_base() [with long unsigned int _Idx = 1ul; _Head = std::reference_wrapper<std::basic_string<char> >]’:|
    /usr/include/c++/4.8/tuple|251|  recursively required from ‘constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl() [with long unsigned int _Idx = 1ul; _Head = std::reference_wrapper<std::basic_string<char> >; _Tail = {}]’|
    /usr/include/c++/4.8/tuple|251|required from ‘constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl() [with long unsigned int _Idx = 0ul; _Head = Bar*; _Tail = {std::reference_wrapper<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >}]’|
    /usr/include/c++/4.8/tuple|527|required from ‘constexpr std::tuple<_T1, _T2>::tuple() [with _T1 = Bar*; _T2 = std::reference_wrapper<std::basic_string<char> >]’|
    /usr/local/include/odfaeg/Core/fastDelegate.h|69|required from ‘odfaeg::FastDelegate6<F, A>::FastDelegate6(F, A ...) [with F = void (Bar::*)(const std::basic_string<char>&); A = {Bar*, std::reference_wrapper<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >}]’|
    /usr/local/include/odfaeg/Core/fastDelegate.h|435|required from ‘odfaeg::FastDelegate<void>::FastDelegate(F, A ...) [with F = void (Bar::*)(const std::basic_string<char>&); A = {Bar*, std::reference_wrapper<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >}]’|
    /home/laurent/Développement/Projets-c++/ODFAEG-DEMO/main.cpp|73|required from here|
    /usr/include/c++/4.8/tuple|131|error: no matching function for call to ‘std::reference_wrapper<std::basic_string<char> >::reference_wrapper()’|
    /usr/include/c++/4.8/tuple|131|note: candidates are:|
    /usr/include/c++/4.8/functional|445|note: std::reference_wrapper<_Tp>::reference_wrapper(const std::reference_wrapper<_Tp>&) [with _Tp = std::basic_string<char>]|
    /usr/include/c++/4.8/functional|445|note:   candidate expects 1 argument, 0 provided|
    /usr/include/c++/4.8/functional|439|note: std::reference_wrapper<_Tp>::reference_wrapper(_Tp&) [with _Tp = std::basic_string<char>]|
    /usr/include/c++/4.8/functional|439|note:   candidate expects 1 argument, 0 provided|
    ||=== Build failed: 3 error(s), 12 warning(s) (0 minute(s), 3 second(s)) ===|
    Donc voila je ne vois pas comment je pourrais passer des références à un tuple.

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    hello,

    std::ref("5") ?
    Il me semble qu'une référence à un littéral n'a pas trop d'avenir...

    Si c'est bien ça ne te sens pas seul, il ne reste pas beaucoup de cerveaux disponibles pour les bases quand on fait de la métaprogrammation à la limite de la lisibilité...
    good luck

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    D'ailleurs, c'est ce que dis le compilateur.

    Comment lis-tu ces messages d'erreur?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je ne voulais pas spécialement parler d'une référence à une litéral, bref...

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    759
    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 : 759
    Par défaut
    D'après le message, j'ai l'impression qu'un reference_wrapper est appeler sans paramètre.
    Il faudrait voir comment est fait FastDelegate, mais si pour déterminer le type de retour il y a quelque chose comme decltype(f(A()...), remplace le par decltype(f(std::declval<A>()...)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    FastDelegate est faîtes comme ça :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     template <typename ...A> FastDelegate(void(*f)(A...), A... args) {
            delegate = new FastDelegate0<A...>(f, args...);
        }
        template <class O, typename ...A> FastDelegate(void(O::*f)(A...), O* object, A... args) {
            delegate = new FastDelegate2<O, A...>(f, object, args...);
     
        }
        template <class O, typename ...A> FastDelegate(void(O::*f)(A...) const, O* object,  A... args) {
            delegate = new FastDelegate2<O, A...>(f, object, args...);
        }
        template <class F, typename ...A> FastDelegate(F f, A... args) {
            delegate = new FastDelegate6<F, A...>(f, args...);
        }

    Quand je veux passer une référence il me dit juste ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /home/laurent/Développement/Projets-c++/ODFAEG-DEMO/main.cpp|95|error: no matching function for call to ‘odfaeg::FastDelegate<void>::FastDelegate(<unresolved overloaded function type>, Derived*, std::reference_wrapper<odfaeg::OTextArchive>)’|
    Sinon pour les pointeurs, pas de problèmes.

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

Discussions similaires

  1. [astuce] Comment passer des résultats en sortie par référence
    Par Hibou57 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2007, 20h12
  2. Comment passer des argument a un script php ?
    Par Florina dans le forum Linux
    Réponses: 2
    Dernier message: 11/12/2005, 14h38
  3. [script SQL]comment passer des parametres a un scrip sql?
    Par la7su dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/03/2005, 10h55
  4. Réponses: 7
    Dernier message: 30/12/2004, 12h01

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