Ich habe ein Problem zu verstehen, Funktionstypen (sie erscheinen zum Beispiel als Signature
Template-Parameter eines std::function
):C++ Funktionstypen
typedef int Signature(int); // the signature in question
typedef std::function<int(int)> std_fun_1;
typedef std::function<Signature> std_fun_2;
static_assert(std::is_same<std_fun_1, std_fun_2>::value,
"They are the same, cool.");
int square(int x) { return x*x; }
Signature* pf = square; // pf is a function pointer, easy
Signature f; // but what the hell is this?
f(42); // this compiles but doesn't link
Die Variable f
kann nicht zugeordnet werden, sondern bezeichnet werden kann. Seltsam. Wofür ist es dann gut? Jetzt
wenn ich const qualifizieren die typedef, ich es noch weitere Typen erstellen können aber offenbar für nichts anderes:
typedef int ConstSig(int) const;
typedef std::function<int(int) const> std_fun_3;
typedef std::function<ConstSig> std_fun_4;
static_assert(std::is_same<std_fun_3, std_fun_4>::value,
"Also the same, ok.");
ConstSig* pfc = square; // "Pointer to function type cannot have const qualifier"
ConstSig fc; // "Non-member function cannot have const qualifier"
Welche entfernten Ecke der Sprache habe ich getroffen hier? Wie wird dieser seltsame Typ aufgerufen und was kann ich außerhalb von Template-Parametern verwenden?
Der Standard einfach ermöglicht es Ihnen, * bis * Funktionen über eine typedef ihrer Unterschrift erklären (eigentlich Funktionstyp). – Xeo