2013-06-04 14 views
13

Potrzebuję do wykonania samodzielnej funkcji kompilacji dla sprawdzenia typu równości (szablon funkcji bez argumentów bool eqTypes<T,S>()).funkcja czasu kompilacji dla sprawdzania typu równości

Samodzielny oznacza nie poleganie na bibliotece.

Nie jestem w tym dobry. Właśnie tego próbowałem, ale nie tego potrzebuję.

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

Czy można używać ['std :: is_same'] (http://en.cppreference.com/w/cpp/types/is_same)? – juanchopanza

+0

http://stackoverflow.com/a/3450395/168175 pokazuje, jak zaimplementować go samodzielnie, ale wymagałoby (trywialnie) przystosowania się do funkcji zamiast struktury. – Flexo

Odpowiedz

23

To całkiem proste. Wystarczy zdefiniować cechy typu i funkcji pomocnika:

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

Oto live example.

w C++ 11, jeśli wolno użyć std::false_type i std::true_type, należy przepisać powyższy ten sposób:

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

zawiadomieniu, że typ cecha std::is_same, która robi prawie to samo , jest dostępny jako część Biblioteki Standardowej.

+0

To nie działa dla polimorfizmu. –

+0

Może również 'constexpr bool eqTypes()'. –

+0

@TimothyShields: To prawda, zakładałem, że celem jest C++ 03. Dodam wersję C++ 11-ish –

2

Oto jak można to zrobić w C, bez żadnych magicznych rozszerzeniach GCC:

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

Np:

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

Czy wywoła błąd kompilacji, jeśli y nie jest int. Aby uzyskać wyjaśnienie, patrz here.

Powiązane problemy