2013-05-25 11 views
8

Gibt es eine Typeigenschaftsvorlage, die den Basistyp eines bestimmten Typs zurückgibt. Von Basistyp Ich meine den Typ mit allen Wertmodifikatoren, const, volatile usw. abgestreift. Zum Beispiel mit einer hypothetischen Züge Funktion:Basistyp eines Schablonentyps abrufen (const/reference/etc.)

base<int>::type == int 
base<int const>::type == int 
base<int&>::type == int 

Ich bin mir dessen bewusst remove_const und remove_reference und bin zur Zeit mit ihnen nur in Kombination. Ich frage mich, ob es schon eine solche Eigenschaft gibt und vielleicht, wenn es einen richtigen Namen für das gibt, was ich meine?

+2

'Typname std :: remove_cv :: type> :: Baumuster zur? –

+0

@AndyProwl, ja, das mache ich jetzt ... Ich denke, das deckt alle Arten der Referenzierung des Typs ab. –

Antwort

10

Ich würde das wahrscheinlich eine Art Alias ​​wie definieren:

template<typename T> 
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type; 

Hinweis, dass hereR. Martinho Fernandes den Namen Unqualified für einen solchen Typ alias vorschlägt.

Der Standardtyp Merkmal std::decay, auf der anderen Seite die gleiche Funktion wie die oben und etwas mehr für Typen Array und Funktion, die kann oder auch nicht sein, was Sie wollen.

+0

Wie wird der 'Unqualified' mit' std :: common_type' verglichen (ich habe [teste] (http://coliru.stacked-crooked.com/view?id=b36ef298b0537eb2841c01d881685e7a-8a676986784bd3a58ce3ec015645a41f) es sogar mit [beiden Eigenschaften] ] (http://coliru.stacked-crooked.com/view?id=91fd0a114c9d0e6835133fb5062f01c8-8a676986784bd3a58ce3ec015645a41f))? – chris

+0

@chris: Huh, das ist verwirrend. Vielleicht verpasse ich etwas, aber gibt der Standard nicht an, dass 'common_type ' 'T' sein sollte, wenn es nur ein Typargument gibt? –

+0

Ich weiß, es funktioniert wie eine Identitätsvorlage, aber von dem, was ich gesehen habe, alles, was es entfernt, ist Lebenslauf und Referenzen. Ich weiß nicht, ob es das zu irgendetwas anderem macht. – chris

1

Offensichtlich hängt es davon ab, was genau Sie vom Typ entfernen möchten. std::decay könnte das sein, was Sie suchen (entfernt Referenzen, const/volatile, verfällt Array zu Zeiger und Funktion zum Funktionszeiger). Wenn Sie nicht möchten, dass das Array auf einen Zeiger und auf einen Funktionspointer-Zerfall eingestellt ist, müssen Sie bei std::remove_reference und std::remove_cv bleiben (entfernt const und volatile). Natürlich können Sie die beiden in Ihre eigene Schreibschrift kombinieren, um die Benutzung zu vereinfachen.

4

versuchen std::decay. Es simuliert, was passiert, wenn Sie Argumente an Funktionen nach Wert übergeben: strip-cv-qualifikatoren auf oberster Ebene, Verweise, konvertiert Arrays in Zeiger und Funktionen in Funktionszeiger.

Grüße, & rzej