boost any library 的典型用法是啥?

Posted

技术标签:

【中文标题】boost any library 的典型用法是啥?【英文标题】:What is the typical usage of boost any library?boost any library 的典型用法是什么? 【发布时间】:2009-04-23 09:41:37 【问题描述】:

使用 boost.any 库有什么好处?你能给我一些现实生活中的例子吗?为什么不能通过在对象层次结构的根中使用一些泛型类型并使用该基类型创建容器来实现相同的功能?

【问题讨论】:

当我第一次了解 Boost 时,我在 Dobbs 博士的 Herb Sutter 和 Jim Hyslop 中找到了 this article。我发现它很有帮助。 【参考方案1】:

boost::any 将愉快地存储整数和浮点数,这些类型显然没有基类。您可以使用它的真实示例是高级解释语言的虚拟机。您的“函数”对象将需要一组参数。这可以在后台使用std::list<boost::any> 轻松实现。

【讨论】:

【参考方案2】:

我认为 Boost.Variant 应该始终是首选,因为它是非侵入性的,并且仍然需要非常结构化的编程。

但我猜 boost.any 背后的主要思想是提供等效的 java 和 c# 对象类型。这是一种说“是的,我们可以”的方式! :-)

【讨论】:

Boost.Variant 不能替换 Boost.Any,以防在运行时知道要保存的类型。例如,请参阅 SCFrench 评论中提到的链接:ddj.com/cpp/184403808 -1。 Boost.any 可以存储所有类型,甚至是原始类型,而不仅仅是 c#/java “object”等价物。 @Macke 在这种情况下不要说 C#/java。 C# (CLR) 可以在对象中存储原始值。这些语言可能看起来相似,但它们确实不同。【参考方案3】:

我们在属性映射 (std::map<std::string, boost::any>) 中使用了它,以便在一个简单、扁平的数据空间中动态存储很多东西。

大多数情况下,我们要么存储 smart-ptr-to-scriptable-objects 或字符串,但有些条目存储在其他类型(浮点数、vec3f、矩阵和其他非标准对象)中。

它可以很好地为 c++ 添加更多动态功能,或者在任何你想要一些类型擦除的地方添加任何类型的数据到对象。

【讨论】:

【参考方案4】:

为什么不能通过在对象层次结构的根中使用一些泛型类型并创建具有该基本类型的容器来实现相同的功能?

这称为对象层次结构——一种您为解决外围问题而人为注入设计的结构。此外,这样的构造很容易出错,错误的实现会造成严重破坏。 Boost.Any 社区审查的安全、经过充分测试的替代方案。

你能给我一些现实生活中的例子吗?

TinyJSON 使用boost.Any

使用 boost.any 库有什么好处?

我参考了introductory 文档。

【讨论】:

用 C++ 表示 JSON boost::variant<T...> 在我看来是更好的选择。 我没有写那个库 :-) 我相信你有正当的理由。【参考方案5】:

我们使用 boost.any 作为类型安全标记的可变参数容器的载体类型。这是什么意思:

我们有一个“筏”对象,它通过一组过滤器。当过滤器想要向 raft 中添加数据时,它可以这样做:

raft.addTaggedData<ETag1>(3.0);
raft.addTaggedData<ETag2>("a string")`;
std::string str = raft.getTaggedData<ETag2>();
int a = raft.getTaggedData<ETag1>(); // <-- Compile error

其中ETag1ETag2 是枚举的成员,我们使用特征模板将标签映射到类型。

raft 类使用pair&lt;ETagType, boost::any&gt;list 作为后备存储。 Boost.any 为我们节省了管理各种类型的原始缓冲区的痛苦。

【讨论】:

使用一点 boost.MPL,您可以使用 boost.Variant 而不是 Boost.Any。 即使使用 boost.any 也有点牵强;我的团队在 C++ 特性方面有点保守。另外,我还没有学过 MPL。 :) @Benoît Boost.Variant 将要求 raft 知道所有可能的标签(或至少知道它们的值类型)。例如,如果筏子通过可能以这种方式存储一种私有数据的独立模块浮动,这可能是不可能的。或者即使可能由于这种方式隐含的增加的源依赖关系而可能不需要。尽管 Boost.Any 会增加运行时成本,但这是一种权衡。

以上是关于boost any library 的典型用法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `boost::any` 比 `void*` 更好?

如何定义 boost::any 运算符 ==

boost::any_cast 到我的自定义类

boost::any_cast - 仅在隐式转换不可用时抛出?

boost::ptr_vector 和 boost::any 的问题

Boost--any