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

bzzcjhmw  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(80)

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

cxfofazt1#

这很简单,只需要定义一个类型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; }

这是一个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; }

请注意,类型trait std::is_same(它做的事情与此几乎相同)作为标准库的一部分提供。

epggiuax

epggiuax2#

下面是如何在C语言中实现这一点,而不需要任何神奇的GCC扩展:

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

例如:

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

如果y不是int,将触发编译错误。
有关说明,请参见here

f3temu5u

f3temu5u3#

#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") \
}

相关问题