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 :

Tableau d'appels de fonction / lambda / templates


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Tableau d'appels de fonction / lambda / templates
    Bonjour,

    J'aimerais appeler en parallèle (multithreading) une série d'instanciation d'une fonction libre template dont la signature est (pour simplifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T>
    int maFonction(std::string param1, T param2);
    J'aimerais, pour lancer mes threads, utiliser une boucle, comme décrit sur cette page.

    Je dois donc faire un tableau d'"appels de fonction". Tous les arguments de la fonction, pour chaque instanciation, sont connus à la construction du tableau. Je pense doncqu'il faut créer un tableau de std::function (mais bon... je maîtrise mal ces sujets).

    M'orienté-je sur une bonne piste ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne pourras pas créer un tableau sur fonctions de paramètres de types différents, par contre. Pour ça, il faudra de la virtualité en plus des templates.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu ne pourras pas créer un tableau sur fonctions de paramètres de types différents, par contre.
    Je n'arrive même pas à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::function<int(std::string, float)> monWrapper= maFonction<float>("une_chaine", 0.5);
    Je ne comprend pas ce qui défrise le compilateur.

    Citation Envoyé par Médinoc Voir le message
    Pour ça, il faudra de la virtualité en plus des templates.
    Je tiens à garder mes fonctions libres.
    No way, a priori.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je viens de regarder parce que je ne connais pas std::function et Cie, et il semblerait que std::function ne mémorise qu'un pointeur de fonction, sans paramètres.

    Regarde plutôt du côté de std::mem_fn qui semble mémoriser des paramètres en plus.Edit: Ben non plus, en fait.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je viens de regarder parce que je ne connais pas std::function et Cie, et il semblerait que std::function ne mémorise qu'un pointeur de fonction, sans paramètres.
    Si. Regarde sur CPP Reference, le deuxième exemple (store a lambda).

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par oodini Voir le message
    Si. Regarde sur CPP Reference, le deuxième exemple (store a lambda).
    Ah, dans ce cas, ça s'utiliserait plutôt comme ça:
    Code C++11 : Sélectionner tout - Visualiser dans une fenêtre à part
    std::function<int()> monWrapper= []() { return maFonction<float>("une_chaine", 0.5); }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Personnellement, je verrais un truc du genre:
    Code C++ : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class FunctionCallerBase
    {
    public:
    	virtual ~FunctionCallerBase();
    	virtual void call() = 0;
     
    };
    //Fonction statique facile à utiliser dans diverses APIs de multithreading
    //Changer les types (void*, convention d'appel, etc.) au besoin.
    void Call(FunctionCallerBase *p)
    {
    	p->call();
    }
     
    template< class T >
    class MaFonction_Caller : FunctionCallerBase
    {
    	int (*m_pFonc)(std::string, T);
    	std::string m_arg1;
    	T m_arg2;
    public:
    	int ret;
    public:
    	MaFonction_Caller(int (*pFonc)(std::string, T), std::string arg1, T arg2)
    	 : m_pFonc(pFonc), m_arg1(arg1), m_arg2(arg2) { }
     
    	void call()
    	{
    		ret = m_pFonc(m_arg1, m_arg2);
    	}
    };
     
    template<class T>
    FunctionCallerBase* WrapMaFonction(std::string arg1, T arg2)
    {
    	return new MaFonction_Caller<T>(MaFonction<T>, arg1, arg2);
    }
    Et ça s'utiliserait ainsi:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FunctionCallerBase* fonctions[] = { 
    	WrapMaFonction("une_chaine", 0.5),
    	WrapMaFonction("une_chaine", 42),
    	WrapMaFonction("une_chaine", "toto")
    };
     
    ...
     
    for( i=0 ; i<ARRAYSIZE(functions) ; ++i )
    	whatever_create_thread(Call, fonctions[i]);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. label, tableau et appel de fonction dans une boucle
    Par amine2208 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 29/04/2013, 15h02
  2. Appeler une fonction avec un tableau en parametre ?
    Par devoluti0n dans le forum C++
    Réponses: 9
    Dernier message: 11/04/2008, 16h21
  3. Aide tableau appels de fonction
    Par pepsi33 dans le forum C++
    Réponses: 2
    Dernier message: 08/11/2007, 08h20
  4. Réponses: 1
    Dernier message: 25/07/2007, 10h03
  5. Réponses: 4
    Dernier message: 21/04/2007, 20h02

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