提升库和持有价值
boost library and held value
我已经使用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)
- 警告处理为错误这里有什么问题
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 2D数组来自文本输入,中间有空格
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有根的二进制搜索树.保留与其父级的链接
- 在计算中使用二的幂有多有利可图
- 有什么方法可以遍历结构吗
- QNX Momentics: GoogleMock - 返回有价值,在函数中返回 void 错误
- 指针投射:指针有价值吗?
- 为什么"断言"宏即使使用"NDEBUG"也有价值?
- C - 如何编写一个函数,返回真实有价值函数的导数,而不是导数的值
- 在此示例中,std ::变体如何变为有价值_by_exception
- 当定义与运算符有价值时,#define 如何在编程中工作
- 根据模板参数返回有价值的
- C4800是否有任何实际价值
- 一个计算机专业二年级的学生能做些什么,这在未来可能会被认为是有价值的
- 琐碎的可复制性和可能不可复制性的价值表达之间有显著差异吗
- 请推荐一本有价值的关于多线程和boost的书.线程或c++ 11