boost::variant实现

9

我对boost::variant的实现很好奇。

它是这样工作的吗?

两个成员:

  1. 表示当前存储类型的数字(即第一个模板参数为0,第二个模板参数为1等)
  2. 所有可能类型的联合体(当然是最大的大小)。

apply_visitor()

有一个基于当前存储类型数字的switch语句,以调用正确的重载(这在最坏情况下将被编译为跳转表,因此需要常数时间)。

我知道还有一些优化措施可以确保boost::variant不需要动态分配内存,详见此处,但我认为我已经理解了这些内容。


你实际上可以查看源代码,甚至文档可能会告诉你它是如何实现的。我期望有一个缓冲区(足够类型的字符数组)和一个标记来确定如何解释缓冲区。 - David Rodríguez - dribeas
1
提前道歉,但是你已经查看了源代码,对吧?你应该能够通过研究源代码或构建测试应用程序并使用调试器逐步执行来确定它的工作原理,不是吗? - Bukes
1个回答

7
它的工作方式与您描述的基本相同。简而言之:
  1. 它有一个整数which,用于指示使用哪种数据类型。

  2. 使用boost的aligned_storage实现存储,它基本上是最大数据大小的缓冲区。(它在联合中,但出于对齐目的)

最后,访问者确实使用switch实现,使用宏在编译时生成以展开所有类型可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接