9

我只是对boost::variant' 的实现感到好奇。

它像这样工作吗?

两名成员:

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

apply_visitor()

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

我知道还有一些优化可以肯定boost::variant不需要像这里详述的那样动态分配内存,但我想我明白了。

4

1 回答 1

7

它几乎按照您描述的方式工作。长话短说:

  1. 它有一个整数which,指示使用哪种数据类型。

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

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

于 2012-11-13T03:15:15.323 回答