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

C++ 用于检查类型相等性的编译时函数,c++,templates,compile-time,C++,Templates,Compile Time,我需要实现自包含的编译时函数来检查类型相等性(没有参数的函数模板bool eqTypes()) 自给自足意味着不依赖图书馆 我不擅长这一切。这是我试过的,但不是我需要的 template<typename T> bool eq_types(T const&, T const&) { return true; } template<typename T, typename U> bool eq_types(T const&, U const&a

我需要实现自包含的编译时函数来检查类型相等性(没有参数的函数模板
bool eqTypes()

自给自足意味着不依赖图书馆

我不擅长这一切。这是我试过的,但不是我需要的

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; 
}
模板
布尔均衡类型(T常数&,T常数&){
返回true;
}
模板
布尔均衡类型(T常数&,U常数&){
返回false;
}

这很简单。只需定义一个类型trait和一个helper函数:

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

请注意,类型trait的作用几乎相同,它是标准库的一部分

以下是如何在C中实现这一点,而无需任何神奇的GCC扩展:

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

void *q = CHECKED_TYPE(int, &y);
如果
y
不是
int
,将触发编译错误

有关说明,请参阅。

是否允许使用?演示了如何自己实现它,但它需要(很简单)调整为函数而不是结构。不妨
constexpr bool eqTypes()
@timothyshiels:True,我假设C++03是目标。我将添加一个C++11version@liuml07你能详细说明你的陈述吗?我不知道你的意思here@AndyProwl我不知道
eqTypes()
的预期答案。我想这是真的。
std::is_same
也不能用于此。如果预期的答案是
false
,看起来不错。@liuml07:
eqTypes()
应该返回
false
。这是为了检查类型是否相等,而不是一个是否可以转换为另一个,或者从另一个派生出来,等等——还有其他类型特征可以达到这些目的
void *q = CHECKED_TYPE(int, &y);