boost :: C ++ 11的任何typeid优化

时间:2012-04-12 06:33:40

标签: c++ boost stl c++11

  

可能重复:
  When can typeid return different type_info instances for same type?

如果我将下面的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;
}

1 个答案:

答案 0 :(得分:5)

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

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

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

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

这几乎肯定会触发。