boost :: variant和boost :: boost如何工作?

boost库中的variant和any如何在内部工作? 在我正在进行的一个项目中,我目前使用标记联合。 我想用别的东西,因为C ++中的工会不让你使用带有构造函数,析构函数或重载赋值操作符的对象。

我询问任何和变体的大小,并与他们做了一些实验。 在我的平台中,变体将其最长可能types的大小加上8个字节:我认为它只是8字节的types信息,其余的是存储的值。 另一方面,任何只需要8个字节。 因为我在一个64位的平台上,我想任何只是一个指针。

任何人知道它是什么types? Variant如何通过模板实现它的function? 在使用它们之前,我想了解更多关于这些类的知识。

如果你阅读boost :: any文档,他们提供了这个想法的来源: http : //www.two-sdg.demon.co.uk/curbralan/papers/ValuedConversions.pdf

这是基本的信息隐藏,一个必不可less的C ++技能。 学习吧!

由于这里最高票的答案是完全不正确的,我怀疑人们会真正去看看源代码来validation这个事实,这里有一个基本的实现类似的接口,将包装任何types的f()函数和允许它被称为:

struct f_any { f_any() : ptr() {} ~f_any() { delete ptr; } bool valid() const { return ptr != 0; } void f() { assert(ptr); ptr->f(); } struct placeholder { virtual ~placeholder() {} virtual void f() const = 0; }; template < typename T > struct impl : placeholder { impl(T const& t) : val(t) {} void f() const { val.f(); } T val; }; // ptr can now point to the entire family of // struct types generated from impl<T> placeholder * ptr; template < typename T > f_any(T const& t) : ptr(new impl<T>(t)) {} // assignment, etc... }; 

boost :: any除了f()实际上返回typeinfo const&并且提供其他信息访问any_cast函数来工作以外,其它基本的东西都是一样的。

boost::anyboost::variant之间的主要区别是any可以存储任何types,而variant只能存储一组枚举types之一。 anytypes都会存储一个指向对象的void*指针,以及一个typeinfo对象来记住底层的types并强化某种程度的types安全性。 在boost::variant ,它计算最大大小的对象,并使用“placement new”来分配此缓冲区中的对象。 它也存储types或types索引。

请注意,如果您安装了Boost,则应该能够在“any.hpp”和“variant.hpp”中看到源文件。 只要在“/ usr”,“/ usr / local”和“/ opt / local”中search“include / boost / variant.hpp”和“include / boost / any.hpp”,直到find安装的头文件;你可以看一下。

编辑
正如在下面的评论中指出的那样,在我对boost :: any的描述中存在一些不准确的地方。 虽然它可以使用void* (和一个模板化的destroycallback来正确删除指针)来实现,但实际的实现使用any<T>::placeholder*any<T>::holder<T>作为any<T>::placeholder统一types的any<T>::placeholder

boost::any只是在模板化的构造函数运行时的typeinfo快照:它有一个指向非模板化基类的指针,该类提供对typeinfo的访问,构造函数派生出一个types特定的类来满足该接口。 实际上可以使用相同的技术来捕获一组types的其他常见function(例如,stream式传输,通用操作符,特定function),尽pipeboost并不提供对此的控制。

boost :: variant在概念上类似于你之前所做的,但是不是通过使用union ,而是采用手动的方法来放置缓冲区中的对象的构build/销毁(显式地处理alignment问题),它围绕着限制C ++在实际union有复杂的types。

Interesting Posts