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.
'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