提升库和持有价值

boost library and held value

本文关键字:有价值      更新时间:2023-10-16

我已经使用boost一段时间了,但仍然是个新手。我认为我喜欢boost::any,因为我不再需要太多地使用模板来处理使用或返回的类型化对象。然而,我发现有一件事对我来说仍然很不方便,那就是一个更平滑的函数或方法(如果有的话),可以简洁地来回传输其held数据,当然以后不使用cast_any

公约

(case 1)
boost::any a="123456";
std::string s=boost::cast_any<std::string>(a);
(case 2)
boost:any a=123456;
int i=boost::cast_any<int>a;

自定义boost_any:

(case 1)
boost:any a="123456";
std::string s=a;
(case 2)
boost:any a=123456;
int i=a;

我喜欢这个特性,因为在调试程序的过程中,我发现对象的held="123456"在这两种情况下完全相同。在think中,lib的内部实现可能已经做到了这一点(将它所包含的内容转换为string)。这个例子只显示POD类型,我想知道是否有人对这种定制做过任何事情,或者如何为我消除cast_any实现相同的结果。

Boost.Any是一个专门的工具,通常用于在库类型中隐藏用户提供的数据。它不是一个通用的"忘记类型,我有任何"系统。它不能以这种方式工作,因为最终无论如何都必须转换为特定类型。

any_cast隐藏在隐式转换后面是个坏主意,因为如果存储了错误的类型,它就会抛出。把它放在一个简单的任务中会是一个很难找到的bug的来源。

无论如何,对any的调试支持与任何实际代码都是完全独立的,不会帮助您实现所需的功能。如果您真的想要隐式转换,那么需要向any类添加一个模板化的转换运算符。但我强烈建议不要这样做,也不要过度使用any。在大多数情况下,它实际上没有帮助,或者其他解决方案更优越。不要害怕模板。

boost::any是在C++的类型安全精神中实现的。运行时效率和强类型是其设计背后的制约因素。尽管boost::any提供了一种动态类型发现机制,但它本身并不参与此类活动,也不愿意在不同类型的值之间的隐式转换中进行合作。

无论如何,还有any的其他实现(例如Poco::DynamicAny)扩展了boost::any的功能(在可能/安全的情况下隐式转换为目标类型以及许多其他功能)。

关于这个主题的一篇非常有趣的文章是DynamicAny(Overload Journal#86-2008年8月-Aleksandar Fabijanic)