15

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

2 回答 2

29

这很简单。只需定义一个类型特征和一个辅助函数:

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

这是一个活生生的例子

在 C++11 中,如果你被允许使用std::false_typeand 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; }

请注意,类型 traitstd::is_same的作用几乎相同,可作为标准库的一部分使用。

于 2013-06-04T17:46:07.337 回答
4

以下是您可以在 C 中执行此操作的方法,无需任何神奇的 GCC 扩展:

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

例如:

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

y如果is not将触发编译错误int
有关说明,请参见此处

于 2015-08-04T09:13:58.880 回答