2012-04-12 58 views
5

可能重复任何typeid的优化:
When can typeid return different type_info instances for same type?的boost ::对C++ 11

如果我改变以下operand->type() == typeid(ValueType)行成&operand->type() == &typeid(ValueType),该代码仍然有效用gcc和需要尽可能减少可执行文件中的空间(并且多年来一直这样做),但是C++ 11标准是否提供了任何保证,这种优化应该适用于不同的编译器?

template<typename ValueType> 
ValueType * any_cast(any * operand) 
{ 
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME 
     std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0 
#else 
     operand->type() == typeid(ValueType) 
#endif 
     ? &static_cast<any::holder<ValueType> *>(operand->content)->held 
     : 0; 
} 
+0

这在技术上是一个C++ 03的问题,而这个是C++ 11。编辑,使其明确不是重复(答案仍然是正确的) – MSalters 2012-04-12 10:38:01

回答

5

不,不能保证。这个断言可能触发:

assert(&typeid(int) == &typeid(int)); 

虽然这将需要一个非常愚蠢的编译器来引发火灾,但它可能会发生。实际上,只有在动态库边界上比较typeid时,它才会失败:

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2()); 

这几乎肯定会触发。

+1

发现这篇文章,断言可能在Windows中启动,但可能不会在Linux中:[链接](http://stackoverflow.com/questions/1819114/when- can-typeid-return-different-type-in​​fo-instances-for-same-type) – user1095108 2012-04-12 07:40:26

+0

@ user1095108:啊,重复一遍。 :) – GManNickG 2012-04-12 07:41:24

+0

并非完全,人们可能仍然破解他们的任何.hpp,如果他们静态链接。 – user1095108 2012-04-12 07:46:52