2013-06-04 10 views
13

Ich brauche eigenständige Compile-Time-Funktion für die Überprüfung der Gleichheit des Typs (Funktionsvorlage ohne Argumente bool eqTypes<T,S>()) zu implementieren.Kompilierzeit-Funktion für die Überprüfung der Gleichheit des Typs

in sich abgeschlossen bedeutet, dass man sich nicht auf die Bibliothek verlässt.

Ich bin nicht gut in all dem. Das habe ich versucht, aber es ist nicht das, was ich brauche.

template<typename T> 
bool eq_types(T const&, T const&) { 
return true; 
} 

template<typename T, typename U> 
bool eq_types(T const&, U const&) { 
return false; 
} 
+2

Darf man ['std :: is_same'] (http://en.cppreference.com/w/cpp/types/is_same) benutzen? – juanchopanza

+0

http://stackoverflow.com/a/3450395/168175 zeigt, wie Sie es selbst implementieren, aber es würde (trivial) Anpassung an eine Funktion anstelle einer Struktur benötigen. – Flexo

Antwort

23

Es ist ziemlich einfach. Definieren Sie einfach einen Typ Merkmal und eine Hilfsfunktion:

template<typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

template<typename T> 
struct is_same<T, T> 
{ 
    static const bool value = true; 
}; 

template<typename T, typename U> 
bool eqTypes() { return is_same<T, U>::value; } 

Hier ist ein live example.

in C++ 11, wenn Sie berechtigt sind, std::false_type und std::true_type zu verwenden, würden Sie die oben diese Weise umschreiben:

#include <type_traits> 

template<typename T, typename U> 
struct is_same : std::false_type { }; 

template<typename T> 
struct is_same<T, T> : std::true_type { }; 

template<typename T, typename U> 
constexpr bool eqTypes() { return is_same<T, U>::value; } 

Beachten Sie, dass der Typ Merkmal std::is_same, was ziemlich viel macht das Gleiche , ist als Teil der Standardbibliothek verfügbar.

+0

Es funktioniert nicht für Polymorphie. –

+0

Könnte auch 'constexpr bool eqTypes()'. –

+0

@TimothyShields: Wahr, ich nahm an, dass C++ 03 das Ziel war. Ich werde eine C++ 11-ish-Version hinzufügen –

2

Hier ist, wie Sie es in C tun können, ohne Magie GCC-Erweiterungen:

#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0)) 

Z. B:

void *q = CHECKED_TYPE(int, &y); 

einen Compiler-Fehler ausgelöst wird, wenn y nicht int ist.
Erläuterungen finden Sie unter here.

Verwandte Themen