看起来调用boost::any_cast<T>(any&)
会调用一些昂贵的类型检查来确保转换有效。具体来说,它调用执行以下测试以确保演员合法:
std :: strcmp(operand-&gt; type()。name(),typeid(ValueType).name())== 0
如果演员表合法,则代码会执行static_cast。
这对于调试模式似乎很有用,但对于生产代码来说却相当慢。有没有办法跳过strcmp?
答案 0 :(得分:5)
boost::any
包含一组未记录的ValueType * unsafe_any_cast(any * operand)
函数,可以为any*
个操作数执行所需的操作。
您可以获取引用的地址以获得所需内容,或者由于Boost是开源的,您可以在一组这些函数模板中进行修补以获取any&
操作数。
然后只需创建一个包装器,它使用调试版本中的安全版本和发布版本中的不安全版本。但是,我至少还要进行一次添加 - 调试包装器应该捕获为无效转换抛出的异常并调用调试器或使程序崩溃,以便在调试模式下运行时,这些无效的转换不会以某种方式处理隐藏了发布版本具有未定义行为的事实。
另请注意,Boost保留删除不安全版本的权利:
// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time.
因此,如果您决定使用这些功能(或修补程序any.hpp
来扩展它们),那么您需要购买某种程度的维护义务,这些义务可能会或可能不会被接受,具体取决于您的代码可以交付给谁