2016-05-24 4 views
1

Wie kann ich den Typ einer Eingabevariablen innerhalb if Klausel in C++ überprüfen? Wenn es eine Mitgliedsfunktion dafür gibt.Wie überprüft man den Typ der Variablen in der bedingten Anweisung

+1

Mögliche Duplikat [? Wie kann ich den Typ einer Variablen erhalten] (http://stackoverflow.com/questions/ 11310898/how-do-i-get-the-type-of-variables) –

+2

Bitte geben Sie einen Beispielcode an, um zu zeigen, was Sie tun möchten. – songyuanyao

+1

Wenn Sie dies tun möchten, weist dies auf ein Designproblem hin. –

Antwort

2

Es hängt davon ab, welche Art prüft Sie tun möchten.

Die einfachste ist wahrscheinlich

#include <typeinfo>  // for the `std::type_info` type 

if (typeid(input_variable) == typeid(chosen_type)) 
{ 
     // input_variable is of type chosen_type 
} 

Es ist auch möglich, die (Implementierung definiert) Namens-Zeichenketten zu überprüfen, die eine Art identifizieren

if (std::string(typeid(input_variable).name()) == typeid(chosen_type).name()) 
{ 
     // input_variable is of type chosen_type 
} 

Die Umstellung auf std::string für Vergleichsoperatoren zur Arbeit benötigt wird, , wie die .name() Mitgliedsfunktion const char * zurückgibt. Andernfalls vergleiche die name() Mitglieder unter Verwendung strcmp() (entweder in C <string.h> oder in C++ <cstring> - innerhalb Namensraum std).

Berücksichtigen Sie, dass die von typeid(X).name zurückgegebene Zeichenfolge die Implementierung definiert ist.

In C++ 11 hat der Typ type_info einen hash_code() Member, der auch verglichen werden kann. Die Werte hierfür sind in der Implementierung definiert und können zwischen den Ausführungen des Programms variieren. Darüber hinaus, wie Martin Bonner in Kommentaren erwähnt, kann hash_code() falsche Positive für die Gleichheit geben (wenn hash_code() s ungleich vergleichen, sind die Typen unterschiedlich, aber wenn sie gleich vergleichen die Typen können anders sein. Ich erwähne dies, nicht weil ich Anwalt hash_code() s zu vergleichen, sondern weil die ursprüngliche Frage hat nicht erklärt, warum Vergleich von Typen gewünscht wird, so gibt es keine Grundlage, einen Test zu übernehmen, die falsche Übereinstimmungen ergeben könnte, wird nicht angemessen.

+2

Es ist nicht garantiert, dass der hash_code für verschiedene Typen unterschiedlich ist. Mit anderen Worten, es ist ein guter Wert, um unordered_map zu füttern, aber nicht um Gleichheit zu beweisen (benutze 'typeinfo :: operator =()' dafür) –

+0

Wie gesagt, es hängt von der Art des gewünschten Vergleichs ab. Wenn 'hash_code()' Ergebnisse nicht gleich sind, sind die Typen unterschiedlich. Wenn sie gleich sind, können die Typen * verschieden sein, so dass die Wahrscheinlichkeit falscher Übereinstimmungen ungleich null ist.Mögliche Vergleiche mit einer Wahrscheinlichkeit von falsch positiven (oder falsch negativen) Ergebnissen sind in einigen Anwendungen eine gültige Screening-Technik. – Peter

+0

Genau! Ich habe nur kommentiert, weil das OP vielleicht den Eindruck hatte, dass die Gleichheit von 'hash_code()' die gleichen Typen bewiesen hat. –

1

Sie können zu verwenden versuchen:

typeid(yourvariable).name() 

Sie müssen den folgenden Header enthalten es um die Arbeit:

#include <typeinfo> 
0

eine einfache Lösung wäre die Verwendung der folgende:

#include<cassert> 

struct B { static int cnt; }; 
int B::cnt = 0; 

template<class T> 
struct S: B { static int type; }; 

template<typename T> 
int S<T>::type = B::cnt++; 

template<typename T, typename U> 
bool f(T, U) { 
    return S<T>::type == S<U>::type; 
} 

int main() { 
    assert(f(42, 0)); 
    assert(!f(0, .0)); 
} 

Sie können S<T>::type in einer Guard-Anweisung oder wo immer Sie wollen verwenden.
Wenn Sie eine Variable haben x genannt, ist eine Frage der wie etwas mit:

S<decltype(x)>::type 
Verwandte Themen