何时使用'typeid'是最佳解决方案?

Ric*_*den 28 c++ typeid

有很多理由不使用typeid.除了使用type_info(实现定义的行为)的成员之外,通常(总是?)可以使用其他C++语言特性提供类似的功能,例如:重载,虚函数等.

因此,排除依赖于实现定义行为的使用情况,是否有人拥有真实世界的示例哪个typeid是最佳解决方案?

Kon*_*lph 17

因此,排除依赖于实现定义行为的用法,是否有人有一个真实世界的例子,其中typeid是最佳解决方案?

我有时在调试输出中使用它,以验证传递给我的函数的模板参数确实是给定类型.这在我的情况下是有道理的,因为传递给我的函数的实际模板参数是由一个专门的元函数生成的,我想确保使用正确的元函数.


Luc*_*ton 14

当实现多方法(或多个分派)时,从例如地图中选择实际呼叫,使用std::type_info*作为关键字.


Den*_*ose 14

boost::any使用typeid来实现any_cast.

template<typename T> any_cast(const any& other) {
   if(typeid(T) != other.type()) throw bad_any_cast();

   //...actual cast here...
}
Run Code Online (Sandbox Code Playgroud)

你不能确定T是多态的,所以dynamic_cast是不可能的,并且boost::any调用中的封闭类型现在已经丢失,因此其他所有类型的转换都不能提供任何类型的安全性.


tp1*_*tp1 7

编写一个动态树,您可以在树的运行时修改结构中,每个链接中有不同类型的树,它需要typeid.dynamic_cast是不够的.

编辑:这里有一些细节:

class I {
public:
   virtual std::string type() const=0;
   virtual void *value() const=0;
};
template<class T>
class Impl : public I
{
public:
    Impl(T t) : t(t) { }
    std::string type() const { return typeid(T).name(); }
    void *value() const { return &t; }
private:
    T t;
};
Run Code Online (Sandbox Code Playgroud)

然后用这些构建一棵树:

template<class Node, class Link>
class Tree { };
Run Code Online (Sandbox Code Playgroud)

链接类型为I*接口...由于上述适用于T1,T2,T3,T4类型的任何值,我们也可以使用类似的类来处理任何函数T-> T1,T-> T2,T-> T3,T-> T4,并使用该函数类型作为树的节点.现在,您在动态树中描述了正确的表达式.

  • 不相信.我需要更多细节,但我敢打赌,我可以通过界面实现同样的目标. (3认同)