是否可以遍历一个类以查看一个类或其任何基础是否具有特定的特征?

Is it possible to traverse a class to see if a class or any of it's bases have a particular trait?

本文关键字:一个 是否 特征 遍历 任何基      更新时间:2023-10-16

>假设我有一个类X1,它派生自Y和另一个类X2YX2具有特殊的特征Z_trait

现在我有一个模板函数,我想检查参数是否具有特定特征。

这是我所拥有的:

#include<type_traits>
template <typename T>
struct Y       {};
struct X1 : Y<int>  {};
struct X2      {};
struct Z_trait {};
template <typename Container>
struct has_trait;
template <>
struct has_trait<X2>
{
  typedef Z_trait type;
};
template <typename T>
struct has_trait<Y<T>>
{
  typedef Z_trait type;
};
template <typename Container>
void fn(Container& container)
{
  static_assert(std::is_same<typename has_trait<Container>::type, Z_trait>::value
    , "must have Z_trait");
  Container* x = &container;
  ++x;
}
int main()
{
  X1 x1;
  X2 x2;
  Y<char> y;
  fn(x1);
  fn(x2);
  fn(y);
  return 0;
}

演示

我想要它,以便has_trait给出所有三种类型的Z_trait。 我该怎么做? 有没有一种方法可以遍历所有基类,或者是否有一些更简单的方法来测试特征?

请注意,我没有使用使用模板。 原因是VS2013并不完全支持此功能。

哦,仅供参考,我不想更改X1X2Y的实现。

你也想为后代专门has_trait<>,而不仅仅是基础:

#include<type_traits>
struct Y       {};
struct X1 : Y  {};
struct X2      {};
struct Z_trait {};
template <typename Container, typename = void>
struct has_trait;
template <typename T> 
struct has_trait<T, typename std::enable_if< std::is_base_of<X2, T>::value >::type >
{
  typedef Z_trait type;
};
template <typename T> 
struct has_trait<T, typename std::enable_if< std::is_base_of<Y, T>::value >::type >
{
  typedef Z_trait type;
};
template <typename Container>
void fn(Container& container)
{
  static_assert(std::is_same<typename has_trait<Container>::type, Z_trait>::value
    , "must have Z_trait");
  Container* x = &container;
  ++x;
}
int main()
{
  X1 x1;
  X2 x2;
  Y y;
  fn(x1);
  fn(x2);
  fn(y);
  return 0;
}

此外,您可以考虑static constexpr const bool has_z_trait = true;static bool hasTrait(const ZTrait&) { return true; },它使静态断言更简单恕我直言。

相关文章: