我需要实现自包含的编译时函数来检查类型相等(没有参数bool eqTypes<T,S>()
的函数模板)。
自包含意味着不依赖于图书馆。
我对这一切并不擅长。这就是我尝试过的,但这不是我需要的。
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;
}
答案 0 :(得分:27)
这很简单。只需定义一个类型特征和辅助函数:
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; }
这是live example。
在C ++ 11中,如果允许您使用std::false_type
和std::true_type
,则可以通过以下方式重写上述内容:
#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; }
请注意,类型特征std::is_same
(它几乎完全相同)可作为标准库的一部分使用。
答案 1 :(得分:3)
以下是如何在C中完成的,没有任何神奇的GCC扩展:
#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0))
例如:
void *q = CHECKED_TYPE(int, &y);
如果y
不是int
,则会触发编译错误
有关说明,请参阅here。