Wie finden Sie heraus, den Typ einer Variablen?
ich möchte, um herauszufinden, den Typ einer Variable (die variable ist gegeben durch eine Template-parameter, also ich weiß nicht, was es ist).
#include <iostream>
#include <typeinfo>
int main()
{
double test;
std::cout << typeid(test).name() << std::endl;
}
Aber der Code, der nur strahlt:
$./test
d
aber ich bräuchte Doppel statt.
Der Punkt ist, ich weiß nicht, welcher Typ zu erwarten ist, aber ich Schreibe es in ein Unterprogramm, das hast kompiliert werden. Also d ist eine schlechte Idee.
- Wenn es ein template-parameter ist nicht, dass die parameter der Typ selbst?!
- Es gibt keine standard-Weg, um zu tun, was Sie wollen. Der name der Vertretung, ist von der Implementierung definiert, und IIRC die Umsetzung darf nicht auf eine Vertretung in allen. All das war im Fall von polymorphen Typen nur, Glück mit nicht-polymorphe Typen.
- Meine Vermutung ist, dass Sie etwas tun wollen, die Sie noch nicht erklärt. Warum müssen Sie den Namen eingeben? Ich bin mir ziemlich sicher, dass es einen Weg zur Lösung Ihres eigentlichen Problems, sondern als die, die Sie gestellt haben.
- Sie sollten sich wirklich ein Beispiel, das zeigt Ihr problem. Im aktuellen Beispiel gibt es keine template-Parameter, also die wichtigsten Probleme, die Sie lösen wollen, wird nicht erläutert durch das Beispiel...
- Ich bekomme test über die Vorlage, also ich weiß nicht, welche Art es ist. So etwas wie Vorlage<test> ... ich habe mit der Art Informationen, die später bei der Erstellung eines opencl-Programm, das in diesem Fall getan werden muss, zur Laufzeit.
- Betrachten 5.2.8/3 in meinem Entwurf des C++0x-Standard, es sieht aus wie Sie sollen, um eine
std::type_info
Objekt für nicht-polymorphe Typen auch. Natürlich, nicht alle Compiler implementieren, die jedes detail der Standard noch, undname()
etwas zurückgibt, Implementierung-definiert. - Wenn Sie den Typ als template-parameter haben Sie bereits die Art genau dort, haben Sie nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In GNU ABI, es ist ein Helfer demangle die
name()
einertypeid
std::free
?)std::*
(jedoch einschließlich<cstdlib>
konnte definieren ::frei ohne Aufforderung). Wie auch immer, fest der Probe den anderen Weg herum, keine Notwendigkeit, verwirrend Menschen mit "c++0x" das ist nicht nötig 🙂Wenn Sie wissen, die Liste der Arten, die unterstützt werden muss, Sie können schreiben Sie Ihre eigene Funktion, um dies zu tun:
Bemerken, dass, da die Funktion nicht, haben Sie ein argument vom Typ T, es muss immer der Typ explizit angegeben:
und natürlich, der Typ könnte ein parameter Typ:
Können Sie versuchen zu zwingen, einen Fehler in einer Vorlage mit, dass dieser Ausdruck als ein argument, und die compiler-Fehlermeldung über die Art, die Sie suchen.
Z.B. mit GCC:
Also die Typen, die weggeworfen werden
double
,int
undstd::_Rb_tree_iterator<std::pair<const std::basic_string<char>, int> >
.Die erste überladung ist non-const, was bedeutet, dass der Ausdruck eine nicht-const l-value.
Den trick
sizeof(t)==0
ist nötig, um den gesamten Ausdruck abhängig von dem template-parameter, und verzögern den Fehler bis Instanziierung. Der Fehler selbst (Größe des Arrays ist negativ) ist natürlich sinnlos.Und wenn Sie mit C++11, die Sie verbessern können:
Als extra-bonus kann machen den Unterschied zwischen const l-Werte und r-Werte. Die erste ist eine
double
l-Wert, der zweite einconst double
l-Wert und die anderen beiden sind r-Werte.Quelle: http://www.cplusplus.com/doc/tutorial/typecasting/
Mein GCC erzeugt entstellte. E. g. d für
double
ich fürint
c fürchar
und St6vectorIiSaIiEE fürstd::vector<int>
Vom GCC typeinfo:
--edit--
Kann man nicht "wiederholbar" Holen Sie sich die Namen über Compiler. Wenn Sie wollen, um genau das zu tun, müssen Sie hartcodieren ein bisschen wie John Gordon beschreibt in seinem Beitrag.