2012-11-13 112 views
8

我只是很好奇boost::variant的實現。boost :: variant implementation

這樣工作嗎?

兩個成員:

  1. 表示(對於第一模板參數的第二個模板參數等即0,1)
  2. 所有可能類型的聯合當前存儲的類型(A號碼這當然最大的尺寸)。

apply_visitor()

有代表來調用正確的超負荷當前存儲的類型數量switch聲明(這將在最壞的情況下被編譯爲跳轉表所以需要一定的時間)。

我知道還有一些優化,它可以確保boost::variant不需要動態分配內存作爲詳細here,但我想我得到這些。

+0

你實際上可以看看源代碼,甚至文檔可能會告訴它如何實現。我希望有一個緩衝區(足夠類型的char數組)和一個標籤來決定如何解釋緩衝區。 –

+1

提前道歉,但你已經看過來源,對嗎?你應該能夠弄清楚它是如何工作的,無論是通過研究源代碼,或者構建一個測試應用程序,並通過一個調試器來完成,不是嗎? – Bukes

回答

7

它的工作原理與您所描述的相似。長話短說:

  1. 它有一個整數which,指示使用哪種數據類型。

  2. 存儲是使用boost的aligned_storage來實現的,它基本上是最大數據大小的緩衝區。 (它是在一個工會,但爲了對準)

最後,參觀者確實有switch實現的,使用宏來展開對所有類型的可能性在編譯時生成的。