使用std :: is_convertible和std :: type_index

时间:2019-04-17 05:46:13

标签: c++ c++11

我有一个向量std::type_index,它指示特定节点具有的特征类型。我正在实现一个检查节点是否支持特定类型的函数。看起来像这样:

std::vector<std::type_index> traits;

...

template <typename T>
bool hasTrait() {
    return std::find(traits.begin(), traits.end(), typeid(T)) != traits.end();
}

但是,如果类型T是特征中某些基本类型的派生类型,则此方法将无效。为了解决此问题,我想使用std::is_convertible

但是,我只能访问该类型的std::type_index,因此无法执行此操作。需要这样的东西:std::is_convertible<traitTypeIndex::type, T>

1 个答案:

答案 0 :(得分:1)

首先,我会提到使用std::is_convertible当然是不可能的。像type_traits中的所有其他内容一样,std::is_convertible是纯粹的编译时事物。但是您希望它在运行时为您提供一些运行时参数(即type_index)的答案。

第二个问题是,是否可以针对任意多态类型完全执行此检查(通过“任意”,我的意思是您没有任何特定的设计时或运行时信息)。我认为这不是不可能的,因为在C ++中,整个运行时反射为dynamic_cast(启用RTTI时)。但是,即使在dynamic_cast中,我们也只有一个半动态参数(指针或引用)和一个静态(我们不想转换为的类型)。我写semi-dynamic是因为它必须是某个特定类型的指针或引用,它不能绝对地擦除类型的参数(例如void*)。我相信要动态检查两种类型之一是否是另一种的继承者,我们需要运行时提供更多支持。