2017-09-26 4 views
0

Ich muss einen Parameter an die Funktion Klassenmitglied binden. Etwas wie folgt aus:Std :: Bind-Parameter zu Member-Funktion ohne Objekt

#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); 
} 

Aber in diesem Fall habe ich Kompilierungsfehler

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

Sie sollten wahrscheinlich nicht erwarten, dass das von 'std :: bind' generierte Objekt in einen einfachen Mitgliedsfunktionszeiger umgewandelt werden kann ... – Quentin

+0

Wenn Sie nach einer Möglichkeit suchen, eine Memberfunktion außerhalb der Klassendefinition zu definieren, ist dies einfach nicht möglich. Sie können der Klasse nur eine Überladung hinzufügen oder eine freie Funktion definieren. –

Antwort

4

std::bind kein Mitglied Funktionszeiger ergeben, aber es kann ein std::function Objekt erzeugen, die Sie später verwenden können:

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

Danke für die Antwort, aber Ihre Entscheidung unterscheidet sich geringfügig von meinen Anforderungen – tenta4

+0

@ tenta4 der Rückgabetyp von 'std :: bind' ist immer ein Objekt von (irgendeiner) Klassenart. Es gibt keine Konvertierung von diesem in Zeiger-zu-Mitglied-Funktion. Zum einen gibt es keinen Ort für den gebundenen Int. – Caleth

Verwandte Themen