2016-04-08 8 views
4

Von here scheint es mir, dass die std::function keine function_type oder äquivalenten Member-Typ hat, um den tatsächlichen Typ zu exportieren, der verwendet wird, um es zu initialisieren.
Es hat result_type, argument_type, sowie first_argument_type und second_argument_type, aber nichts wie der oben genannten Typ.
Warum bietet es keinen solchen Typ als Teil seiner Schnittstelle?
Es wird sicher einen guten Grund dafür geben, aber ich kann nicht herausfinden, was das ist, also bin ich nur neugierig, es herauszufinden.Warum hat std :: function keinen function_type oder einen äquivalenten Membertyp?


Denn ich weiß, ist die erste Frage sein, warum brauchen Sie es, gut vorstellen, dass ich so etwas wie std::is_same<F1::function_type, F2::function_type>::value tun möchten zu überprüfen, ob ihre zugrunde liegenden Typen das gleiche in einer sfinae Auswertung sind, wo es ist Gut, wenn sie verschiedene Funktionen enthalten, solange die Zeichen gleich sind.
Ich gebe zu, dass es nicht viel Sinn macht, um ehrlich zu sein, die Frage ist nur wegen der Neugier.

EDIT

Wie in den Kommentaren der his answer von @ Brian erwähnt, mißbraucht ich den Begriff initialisieren, wenn ich schrieb:

den tatsächlichen Typ Export verwendet es zu initialisieren

Was mich interessiert ist das Template-Argument in der Tat.
Als ein Beispiel für eine std::function<void(S&, int)> (S ist eine Struktur), function_type wäre void(S&, int).

+1

Für die 'is_same'-Prüfung können Sie einfach prüfen, ob' F1' und 'F2' vom selben Typ sind, oder? – Brian

+0

@Brian yeah, absolut, notiere meinen Kommentar * Ich gebe zu, dass es nicht viel Sinn macht * !! :-) ... Ich bin nur neugierig zu wissen, ob es einen Grund gibt, warum es nicht Teil der Schnittstelle der Funktion ist, auch wenn ich keinen vernünftigen Nutzen dafür finden kann und das wäre schon ein gutes Antwort in der Tat. Ich bin mir nicht sicher, ob * es nutzlos ist * ist die einzige vernünftige Antwort oder wenn es andere Gründe gibt. Das ist alles. – skypjack

Antwort

6

Ich denke, du stellst die falsche Frage. Die richtige Frage ist: Warum sollte es einen solchen Mitgliedstyp geben?

Wenn, sagen wir, eine Funktion Vorlage schreiben, die jede Spezialisierung von std::function akzeptieren kann, dann wird der Template-Parameter bereits sofort zur Verfügung stehen:

template <typename T> 
void f(std::function<T> F) { 
    // you wouldn't write decltype(F)::function_type here; you'd just write T 
} 

Der unbequemer Fall ist derjenige, in dem Sie haben einige Funktion wie

template <typename Callable> 
void f(Callable C); 

Hier haben Sie keine Garantie, dass Callable eine std::function Spezialisierung ist, also auch wenn std::function<T> hatte typedef T function_type, yo Sie möchten nicht auf Callable::function_type für eine beliebige aufrufbar zugreifen. Also würde es hier nichts nützen.

Die richtige Frage ist: Warum legen einige Standardbibliotheksklassen ihre Vorlagenparameter offen, z. B. Container von T (die haben typedef T value_type)? Die Antwort ist, dass der Standard bestimmte Anforderungen an die Containertypen hat, was ein Entwurfsziel widerspiegelt, dass es möglich sein sollte, generische Algorithmen zu schreiben, die auf verschiedenen Containertypen funktionieren, von denen nicht alle Template-Spezialisierungen sind der Form C<T>.Es macht dann Sinn, zu verlangen, dass alle Container value_type exponieren, da dies der einzige einheitliche Weg ist, den Elementtyp aus beliebigen Containern zu extrahieren.

Wenn std::function waren auch eine Instanz einer Callable Konzept, wäre es sinnvoll, die Anforderung zu haben, dass es eine function_type typedef so dass Code zu akzeptieren jede Callable den Funktionstyp zugreifen. Aber das ist nicht der Fall, und es ist nicht nützlich, es nur für die einzelne Vorlage std::function zu haben.

3

Sie können einen leicht schreiben:

template < typename T > 
struct function_type; 

template < typename Sig > 
struct function_type<std::function<Sig>> { using type = Sig; }; 

Auf Ihrer Terminologie: instantiate ist das Wort für Sie suchen. Sie suchen nach dem Typ, den die Vorlage mit instanziiert hat.

Die einzigen Leute, die wissen, warum es kein Mitgliedstyp ist, sind diejenigen, die das Feature entworfen haben und diejenigen, die es gewählt haben (vielleicht). Es könnte einfach etwas sein, an das niemand gedacht hat. Es scheint ein wenig offensichtlich, aber das ist im Rückblick aus der Perspektive, es zu wollen.

Verwandte Themen