什么是提升任何库的典型用法?

时间:2009-04-23 09:41:38

标签: c++ boost

使用boost.any库有什么好处?你能告诉我一些真实的例子吗?为什么在对象层次结构的根目录中创建一些泛型类型并使用该基类型创建容器,无法实现相同的功能?

6 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

当我第一次了解Boost的时候,我找到了Herb Sutter和Jim Hyslop在Dobbs博士的this article。我发现它很有帮助。

答案 3 :(得分:4)

我们在属性地图(std::map<std::string, boost::any>)中使用它,在一个简单,扁平的数据空间中动态存储大量内容。

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

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

答案 4 :(得分:3)

  

为什么在对象层次结构的根目录中创建一些泛型类型并使用该基类型创建容器,无法实现相同的功能?

它调用一个对象层次结构 - 一个人工注入设计的构造,用于解决外围问题。此外,这样的构造很容易出错,错误的实现可能会造成严重破坏。 Boost.Any 社区审核的安全,经过良好测试的替代方案。

  

你能不能给我一些真实的例子?

TinyJSON使用boost.Any

  

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

我参考introductory文档。

答案 5 :(得分:2)

我们使用boost.any作为类型安全标记的可变容器的载体类型。这就是:

我们有一个“筏”对象,它穿过一组过滤器。当过滤器想要向木筏添加数据时,它可以执行以下操作:

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类使用list pair<ETagType, boost::any>作为后备存储。 Boost.any为我们节省了管理各种类型的原始缓冲区的痛苦。