用于检查类型相等性的编译时函数

时间:2013-06-04 17:42:15

标签: c++ templates compile-time

我需要实现自包含的编译时函数来检查类型相等(没有参数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; 
}

2 个答案:

答案 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_typestd::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