【问题标题】:compile-time function for checking type equality用于检查类型相等性的编译时函数
【发布时间】:2013-05-31 05:21:05
【问题描述】:

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

【问题讨论】:

标签: c++ templates compile-time


【解决方案1】:

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

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 的作用几乎相同,可作为标准库的一部分使用。

【讨论】:

  • 也可以constexpr bool eqTypes().
  • @TimothyShields:没错,我假设 C++03 是目标。我将添加一个 C++11-ish 版本
  • @liuml07:你能详细说明你的说法吗?我不确定你在这里的意思
  • @AndyProwl 我不知道eqTypes&lt;Base, Derived&gt;() 的预期答案。我想是truestd::is_same 也不能解决这个问题。如果预期的答案是false,它看起来不错。
  • @liuml07: eqTypes&lt;Base, Derived&gt;() 确实应该返回 false。这应该检查类型是否相等,而不是一个是否可以转换为另一个,或者从另一个派生,等等 - 还有其他类型特征可以用于这些目的
【解决方案2】:

您可以在 C 中做到这一点,而无需任何神奇的 GCC 扩展:

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

例如:

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

如果y 不是int,将触发编译错误。
解释见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2023-04-04
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多