C++ boost库的典型用法是什么?

C++ boost库的典型用法是什么?,c++,boost,C++,Boost,使用boost.any库有什么好处?你能给我举一些现实生活中的例子吗?为什么在对象的层次结构的根中有一些泛型类型并创建具有该基类型的容器就不能实现相同的功能?boost::any很乐意存储int和float,这些类型显然没有基类。您可以使用它的一个实际示例是高级解释语言的虚拟机。您的“函数”对象将需要一个参数数组。这可以通过幕后的std::list轻松实现 为什么在对象层次结构的根目录中有一些泛型类型并创建具有该基类型的容器就不能实现相同的功能 它调用一个对象层次结构——一个为解决外围问题而人工

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

boost::any很乐意存储int和float,这些类型显然没有基类。您可以使用它的一个实际示例是高级解释语言的虚拟机。您的“函数”对象将需要一个参数数组。这可以通过幕后的
std::list
轻松实现

为什么在对象层次结构的根目录中有一些泛型类型并创建具有该基类型的容器就不能实现相同的功能

它调用一个对象层次结构——一个为解决外围问题而人工注入到设计中的构造。此外,这样的构造很容易出错,错误的实现可能造成严重破坏<代码>增强。任何都是经过社区审核的安全、经过良好测试的替代方案

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

使用
boost.Any

使用boost.any库有什么好处


我参考文档。

我认为Booost。变体应该总是首选,因为它是非侵入性的,仍然需要非常结构化的编程。


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

我们使用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
raft.addTaggedData(3.0);
raft.addTaggedData(“字符串”)`;
std::string str=raft.gettaggedata();

int a=raft.gettaggedata();// 我们在属性映射(
std::map
)中使用了它,以便在一个简单、平坦的数据空间中动态存储很多东西

大多数情况下,我们要么将智能ptr存储到可编写脚本的对象或字符串中,要么将一些条目存储到其他类型(浮点、vec3f、矩阵和其他非标准对象)中


它非常适合于在C++中添加更多的动态功能,或者不管你想在哪里删除某个对象,只要添加任何类型的数据到对象。

表示C++中的JSON:代码:Boo::变体在我看来是更好的选择。我没有写那个库:-我确信你有正当的理由。您可以使用boost.Variant而不是boost.Any。即使使用boost.Any也有点牵强;当谈到C++特性时,我的团队有点保守。另外,我还没有学会MPL。:)@Benoît Boost.变体要求筏体知道所有可能的标签(或至少它们的值类型)。例如,如果raft通过独立的模块浮动,这可能是不可能的,这些模块可能以这种方式存储一种私有数据。或者,即使有可能,由于这种方式意味着源依赖性的增加,也可能不希望这样做。尽管Boost.Any会增加运行时成本,因此这是一个折衷方案。Boost.Variant不能替代Boost。任何情况下,要保留的类型在运行时已知。例如,请参阅SCFrench评论中提到的链接:-1。Boost.any可以存储所有类型,甚至是原始类型,而不仅仅是c#/java“对象”等价物。@Macke在这种情况下不说c#/java。C#(CLR)可以在对象中存储基元值。这两种语言看起来可能相似,但确实不同。当我第一次学习Boost's any时,我在Dobbs博士的文章中发现了Herb Sutter和Jim Hyslop。我觉得这很有帮助。