2016-06-26 17 views
0

codiert sind Ich wollte wissen, was ich hier falsch machen könnte. Das ist mein Codebeispiel. Es ist nur ein grobes Codebeispiel, das die Verwendung von Funktionszeigern zeigt. Im folgenden Beispiel nimmt der Fuunction-Zeiger einen Parameter auf. Dieser Parameter wurde jedoch bereits während der Funktionszeigerzuweisung zugewiesen. Jetzt muss ich noch einen Funktionszeiger bereitstellen, um ihn aufzurufen Parameterwert, obwohl dieser Wert immer verwendet wird (es sei denn, ich habe std :: placeholder verwendet). Meine Frage ist, wie rufe ich einen Funktionszeiger auf, der einen Parameter erfordert und dessen Parameter bereits zugewiesen worden ist, ohne einen Parameter zu übergeben.std :: Funktion erfordert immer noch Parameter, wenn keine Platzhalter in

#include <iostream> 
#include <functional> 

using namespace std; 

std::function<std::string(std::string)> fptr; 

std::string foo() 
{ 
    return fptr(); //--->statement A - I need to invoke this funct ptr without passing a parameter as a parameter has already been assigned in statement B 
} 

std::string bar(std::string p) 
{ 
    return p; 
} 

int main() 
{ 
    fptr = std::bind(&bar,"Hello"); --->statement B 
    std::cout << foo(); 
} 

Hinweis in std::bind ich keine Platzhalter verwendet haben und „Hallo“ ist der Parameter an die Funktion bar. Meine Frage ist warum

return fptr(); 

nicht funktioniert. Wenn ich folgendes tue

return fptr("Bye"); 

Es funktioniert und gibt "Hallo" zurück. (Kein Punkt der Parameter während fptr Anruf übergeben) Warum funktioniert es nicht ohne einen Parameter?

Antwort

3

Das Ergebnis von std::bind ermöglicht es Ihnen, mehr Argumente als benötigt zu übergeben und diese zusätzlichen Argumente zu ignorieren. In Ihrem Fall kann std::bind(&bar, "Hello") ohne Argumente aufgerufen werden, oder durch fptr, mit einem std::string Argument. Die Lösung für Ihr Problem ist einfach, ändern Sie einfach den Typ fptr zu std::function<std::string()>, die keine Argumente akzeptieren und eine Zeichenfolge zurückgeben.