2016-04-03 4 views
2

ein std::function Objekt wie folgt erstellt:Wie das Aussehen einer Template-Instantiierung wie in std ändern :: function

std::function<int(int)> f = ... 

seit <int(int)> ist nicht das, was ich aus einer Vorlage in der Regel wissen möchte ich wissen, wie So etwas in meiner Klasse zu machen? Wie könnten wir uns zum Beispiel in Kartenvorlagen wie map<std::string -> int>?

+0

'int (int)' ist Ihr üblicher Typparameter (es ist ein Typ einer Funktion, die ein 'int' nimmt und ein' int' zurückgibt), es ist kein magisches Syntaxding, also 'std :: string -> int' ist nicht möglich. – milleniumbug

Antwort

4

Der Vorlagenparameter ist ein Typparameter. Wie jeder Typvorlagenparameter. Sie können also keine neue Syntax wie das von Ihnen angegebene Beispiel erstellen.

std::function ist spezialisiert, um Parameter aus der Signatur zu extrahieren, die Sie als Typ senden.

Nehmen Sie diesen Code zum Beispiel:

template<typename> 
struct MyFunction; 

template<typename R, typename... Args> 
struct MyFunction<R(Args...)> { 
    // do whatever you want 
}; 

Ein Typ wie diese können auch Alias-Bezeichnung:

using myFunctionType = int(double); 

void doThings(myFunctionType* f) { 
    // the type of f is int(*)(double), a function pointer. 
} 

Oder Sie können diese Art extrahieren mit std::remove_pointer:

// the following line is equivalent to using myFunctionType = int(double); 
using myFunctionType = std::remove_pointer<int(*)(double)>::type; 

So Grundsätzlich ist der Typ int(double) ein Funktionstyp, normalerweise wird er mit Punkt verwendet ers. In unserem Fall ist unser Typ ein Funktionstyp, der int zurückgibt und einen double als Parameter verwendet. Es gibt keine magische Syntax hier.

4

Ich glaube nicht, dass die Syntax, nach der Sie suchen, möglich ist.

std::function funktioniert so etwas wie so:

template < typename Sig > struct function; 

template < typename R, typename ... Params > 
struct function<R(Params...)> 
{ 
    // stuff and more stuff 
}; 

Signaturen Typen sind. Sie spezialisieren sich dann wie oben, um die zugrunde liegenden Typen ... wie den Rückgabetyp und die Parametertypen zu erhalten.

Aber Sie können nicht einfach beliebige Syntax in eine Vorlage einwerfen und erwarten, dass es funktioniert. Die Sprache muss es unterstützen, ist es bei Unterschriften.