2013-06-04 2 views
13

È necessario implementare la funzione di compilazione autonoma per il controllo dell'eguaglianza di tipo (modello di funzione senza argomenti bool eqTypes<T,S>()).funzione di compilazione per verificare l'uguaglianza di tipo

autonomo significa non fare affidamento sulla libreria.

Non sono bravo in tutto questo. Questo è quello che ho provato, ma non è quello che mi serve.

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

È possibile utilizzare ['std :: is_same'] (http://en.cppreference.com/w/cpp/types/is_same)? – juanchopanza

+0

http://stackoverflow.com/a/3450395/168175 mostra come implementarlo da solo, ma sarebbe necessario (banalmente) adattarsi per essere una funzione anziché una struttura. – Flexo

risposta

23

È abbastanza semplice. Basta definire un tipo di tratto e una funzione di supporto:

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; } 

Ecco un live example.

in C++ 11, se si è permesso di usare std::false_type e std::true_type, si dovrebbe riscrivere il sopra in questo modo:

#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; } 

avviso, che il tipo di tratto std::is_same, che fa più o meno la stessa cosa , è disponibile come parte della libreria standard.

+0

Non funziona per il polimorfismo. –

+0

potrebbe anche 'constexpr bool eqTypes()'. –

+0

@TimothyShields: vero, stavo dando per scontato che il C++ 03 fosse l'obiettivo. Aggiungerò una versione 11-ish C++ –

2

Ecco come si può fare in C, senza alcuna estensione GCC magici:

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

es:

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

attiverà un errore di compilazione, se non è yint.
Per ulteriori informazioni, vedere here.