2

它看起来像调用boost::any_cast<T>(any&)一些昂贵的类型检查来确保强制转换是有效的。具体来说,它调用执行以下测试以确保强制转换是合法的:

std::strcmp(操作数->type().name(), typeid(ValueType).name()) == 0

如果强制转换是合法的,那么代码会执行一个 static_cast。

这对于调试模式似乎很有用,但对于生产代码来说却相当慢。有没有办法跳过strcmp?

4

1 回答 1

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来扩展它们),您将承担一定程度的维护义务,这取决于您的代码可能交付给谁,这可能是可接受的,也可能是不可接受的。

于 2012-05-17T00:00:38.497 回答