2017-09-26 6 views
0

J'ai besoin de lier un paramètre à la fonction de membre de la classe. Quelque chose comme ceci:std :: lie le paramètre à la fonction membre sans objet

#include <functional> 
#include <iostream> 

struct test 
{ 
    void func(int a, int b) 
    { 
     std::cout << a << " " << b << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    typedef void (test::*TFunc)(int); 
    TFunc func = std::bind(&test::func, 1, std::placeholders::_1); 
} 

Mais dans ce cas, j'ai erreur de compilation

error: static assertion failed: Wrong number of arguments for pointer-to 
-member 
+1

Vous ne devriez probablement pas vous attendre à ce que l'objet généré par 'std :: bind' soit convertible en un pointeur de fonction membre simple ... – Quentin

+0

Si vous cherchez un moyen de définir essentiellement une fonction membre en dehors de la définition de la classe, cela ne peut tout simplement pas être fait. Vous pouvez seulement ajouter une surcharge à la classe ou définir une fonction libre. –

Répondre

4

std::bind ne donne pas un pointeur de fonction membre, mais il peut produire un objet std::function que vous pouvez utiliser plus tard:

::std::function< void (test *, int)> func = std::bind(&test::func, std::placeholders::_1, 1, std::placeholders::_2); 
test t{}; 
func(&t, 2); 
+0

Merci de votre réponse, mais votre décision diffère légèrement de mes exigences – tenta4

+0

@ tenta4 le type de retour de 'std :: bind' est toujours un objet de type (certains) de classe. Il n'y a pas de conversion de cela à la fonction de pointeur à membre. Pour une chose, il n'y a nulle part où le 'int' lié aller. – Caleth