C++ 使用std::type\u索引是否可转换

C++ 使用std::type\u索引是否可转换,c++,c++11,C++,C++11,我有一个向量std::type_index,它指示特定节点具有的特征类型。我正在实现一个函数,用于检查节点是否支持特定类型。看起来是这样的: std::载体性状; ... 模板 布尔·哈斯特里特(){ 返回std::find(traits.begin()、traits.end()、typeid(T))!=traits.end(); } 然而,如果typet是traits中某个基本类型的派生类型,那么这将不起作用。为了解决这个问题,我想使用std::is\u convertible 但是,我只能

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

std::载体性状;
...
模板
布尔·哈斯特里特(){
返回std::find(traits.begin()、traits.end()、typeid(T))!=traits.end();
}
然而,如果type
t
是traits中某个基本类型的派生类型,那么这将不起作用。为了解决这个问题,我想使用
std::is\u convertible


但是,我只能访问该类型的
std::type_索引,所以我不能这样做。需要这样的东西:
std::is_convertible
首先,我要提到的是,使用
std::is_convertible
肯定是不可能的。与
type\u traits
中的所有其他内容一样,
std::is\u convertible
纯粹是编译时的事情。但您希望它在运行时为某个运行时参数(即类型_index)提供答案


第二个问题是,是否可以对任意多态类型实现此检查(所谓“任意”,我的意思是您没有任何特定的设计时或运行时信息)。我认为这不是不可能的,因为我们在C++中运行的整个反射是<代码> DyjiCaseCase<代码>(当RTTI在进行时)。然而,即使在
dynamic\u cast
中,我们也有一个半动态参数(指针或引用)和一个静态参数(我们不想转换为的类型)。我写
半动态
,因为它需要是指向某个特定类型的指针或引用,所以它不能绝对地键入已擦除的参数(如
void*
)。我认为,要动态检查两种类型中的一种是否是另一种类型的继承者,我们需要运行时提供更多支持。

为什么不将所有派生类型的
type\u index
s添加到向量中?因为据我所知,没有简单的方法可以做到这一点。假设基类A和下面的继承链A->B->C->D。假设C在traits列表中。我希望函数匹配A、B和C,但不匹配d。我必须想办法将C分解为A和B,并将所有三个都添加到向量列表中。将所有A、B和C传递给可变模板参数,
template bool hasTraits(){/*do check*/}
hasTraits()
,这是不可接受的吗,但是很有趣。谢谢–也许我必须在trait和节点中包含某种对应于特定服务器的std::type_索引(因为这些索引不会被继承)。