Reputation: 448
I need to implement self contained compile-time function for checking type equality (function template without arguments bool eqTypes<T,S>()
).
self contained means not relying on library.
I'm not good in all this. That's what I tried, but it's not what I need.
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;
}
Upvotes: 16
Views: 23640
Reputation: 39
#define CHECK_TYPE_EQUAL(type_a, type_b) { \
type_a type_a##_var __attribute__((unused)); \
type_b *type_b##_ptr __attribute__((unused)); \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic error "-Wincompatible-pointer-types\"") \
type_b##_ptr = &type_a##_var; \
_Pragma("GCC diagnostic pop") \
}
Upvotes: 0
Reputation: 25268
Here's how you can do it in C, without any magic GCC extensions:
#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0))
E.g:
void *q = CHECKED_TYPE(int, &y);
Will trigger a compile error if y
is not int
.
For explanation, see here.
Upvotes: 4
Reputation: 126412
It's quite simple. Just define a type trait and a helper function:
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; }
Here is a live example.
In C++11, if you are allowed to use std::false_type
and std::true_type
, you would rewrite the above this way:
#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; }
Notice, that the type trait std::is_same
, which does pretty much the same thing, is available as part of the Standard Library.
Upvotes: 32