是否可以遍历一个类以查看一个类或其任何基础是否具有特定的特征?
Is it possible to traverse a class to see if a class or any of it's bases have a particular trait?
>假设我有一个类X1
,它派生自Y
和另一个类X2
。 Y
和X2
具有特殊的特征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并不完全支持此功能。
哦,仅供参考,我不想更改X1
、X2
或Y
的实现。
你也想为后代专门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; }
,它使静态断言更简单恕我直言。
相关文章:
- 此代码是否违反一个定义规则
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 是否可以同时声明一个类成员的常量/非常量?
- C++-字符串是否包含一个带有简单循环的单词
- 检查注册表项是否链接到(或副本)另一个注册表项
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 一元*运算符的操作数是否期望一个 prvalue
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 是否可以创建一个从不同类调用函数的线程?
- 这些场景中的任何一个是否会造成内存泄漏
- 在一个结构中,使用一个数组字段访问另一个是否合法
- C++检查前 5 个或接下来的 5 个元素中的任何一个是否等于值