有很多理由不使用typeid
.除了使用type_info
(实现定义的行为)的成员之外,通常(总是?)可以使用其他C++语言特性提供类似的功能,例如:重载,虚函数等.
因此,排除依赖于实现定义行为的使用情况,是否有人拥有真实世界的示例哪个typeid
是最佳解决方案?
Kon*_*lph 17
因此,排除依赖于实现定义行为的用法,是否有人有一个真实世界的例子,其中typeid是最佳解决方案?
我有时在调试输出中使用它,以验证传递给我的函数的模板参数确实是给定类型.这在我的情况下是有道理的,因为传递给我的函数的实际模板参数是由一个专门的元函数生成的,我想确保使用正确的元函数.
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
调用中的封闭类型现在已经丢失,因此其他所有类型的转换都不能提供任何类型的安全性.
编写一个动态树,您可以在树的运行时修改结构中,每个链接中有不同类型的树,它需要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,并使用该函数类型作为树的节点.现在,您在动态树中描述了正确的表达式.
归档时间: |
|
查看次数: |
7909 次 |
最近记录: |