2013-05-11 48 views
0

我有一個需求,我需要在運行時生成函數參數。 在編譯時,我不知道參數的數量或它們的類型。它必須在運行時從文件中讀取,生成代碼並動態加載。元編程和運行時代碼生成

我以前使用過M4的宏生成語言。它以犧牲可讀性和可用性爲代價提供了卓越的性能。

這次我不想走這條路,想用C++ 11 Variadic模板。

有沒有更好的選擇?

+0

模板在編譯時被實例化。你可以把'boost :: variant'的參數作爲參數。在最壞的情況下(即你要麼實現一種編程語言,要麼你的設計很糟糕),請看LLVM。 – 2013-05-12 00:31:29

+0

模板在編譯時被實例化。我沒有看到這可能會如何幫助您解決運行時代碼生成問題。 – Borgleader 2013-05-12 00:31:30

+0

我正在考慮在主程序運行時將其編譯並生成一個.so文件,並將其與正在運行的程序進行鏈接。 – Phelodas 2013-05-12 00:59:41

回答

1

Varadic模板無法工作,因爲您需要在編譯時瞭解所有可能的參數類型列表,然後爲每個模板實例化一個模板。

你的問題本質上是運行時序列化和類型的反序列化。 C++沒有任何「內置」標準方式來執行此操作。

您將需要創建一些GenericParameter的類型,然後有:

`vector<GenericParameter*> params` 

或相似。然後,對於要編碼的每種類型,創建GenericParameter的派生類以將其包裝。當您序列化一組參數時,您需要爲每個派生類創建並存儲某種類型的ID,然後序列化該類的數據。同樣,在相反的方向上讀取類型ID,構造該類型ID的適當派生類,然後使用該類的數據填充它。

這樣做後,您可能可以使用可變模板驗證params矢量匹配編譯的函數,並將運行時向量綁定到靜態已知的函數簽名,並自動生成該適配器採用通用向量並將參數拆箱爲本機類型。同樣在另一個方向。

有些東西看起來叫做protobuf,它在Google這類事情上大量使用,而且我聽到過很多關於它的好消息。