9

boost::variantの実装に興味があります。

このように動作しますか?

2人のメンバー:

  1. 現在保存されているタイプを表す数値(つまり、最初のテンプレートパラメーターの場合は0、2番目のテンプレートパラメーターの場合は1など)
  2. 可能なすべてのタイプの和集合(もちろん最大のサイズ)。

apply_visitor()

正しいswitchオーバーロードを呼び出すために、現在格納されているタイプを表す数値に関するステートメントがあります(これは、最悪の場合、ジャンプテーブルとしてコンパイルされるため、一定の時間がかかります)。

ここboost::variantで詳しく説明するように、メモリを動的に割り当てる必要がない最適化もいくつかあることは理解していますが、私はこれらを取得したと思います。

4

1 に答える 1

7

それはあなたが説明した方法でほとんど機能します。簡単に言えば:

  1. which使用されるデータ型を示す 整数があります。

  2. aligned_storageストレージは、基本的に最大データサイズのバッファであるブーストを使用して実装されます。(ユニオンになっていますが、位置合わせのためです)

最後に、ビジターはswitch、すべての型の可能性を展開するためにマクロを使用してコンパイル時に生成される で実際に実装されます。

于 2012-11-13T03:15:15.323 に答える