我有一个向量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>
答案 0 :(得分:1)
首先,我会提到使用std::is_convertible
当然是不可能的。像type_traits
中的所有其他内容一样,std::is_convertible
是纯粹的编译时事物。但是您希望它在运行时为您提供一些运行时参数(即type_index)的答案。
第二个问题是,是否可以针对任意多态类型完全执行此检查(通过“任意”,我的意思是您没有任何特定的设计时或运行时信息)。我认为这不是不可能的,因为在C ++中,整个运行时反射为dynamic_cast
(启用RTTI时)。但是,即使在dynamic_cast
中,我们也只有一个半动态参数(指针或引用)和一个静态(我们不想转换为的类型)。我写semi-dynamic
是因为它必须是某个特定类型的指针或引用,它不能绝对地擦除类型的参数(例如void*
)。我相信要动态检查两种类型之一是否是另一种的继承者,我们需要运行时提供更多支持。