2009-12-21 67 views
1

我有一個模板類,具有以下定義:將類型存儲爲變量?對於模板類?

ImageRescaleDepth<PIXEL_TYPE_INPUT, PIXEL_TYPE_OUTPUT> 

這個類使用模板,對於幾乎所有自認爲是通用的。反正我需要這個應用程序的命令行版本,做圖像縮放,目前該系統設置以處理以下類型:

1BIT, 2BIT, 4BIT, unsigned 8 bit, signed 8 bit, unsigned 16 bit, signed 16 bit, unsigned 32 bit, signed 32 bit, float, double. 

這些都是由命令行傳入的,我把它們轉換成一個枚舉。

我無法修改ImageRescaleDepth類,因爲它是庫的一部分。我並不完全想要創建一個巨大的開關或eliseif塊,因爲會有100個組合。是否有可能,我可以以某種方式將這些類型存儲爲變量?然後將它們傳遞給構造函數?

回答

5

不,編譯時必須知道模板類的類型,因此必須將圖像類型類型提供給模板。我不得不說,如果這個類是爲了執行許多不同格式之間的轉換,使用模板參數來指定非常差設計的轉換。

+0

我知道。 那麼製作一個100個元件的開關盒是最好的解決方案嗎? – UberJumper 2009-12-21 12:36:27

+2

我會使用一個映射,鍵入一對from/to類型(作爲枚舉或常量,而不是類型名稱)到指向某種創建函數的指針。換句話說,一家工廠。 – 2009-12-21 12:38:52

+0

創建函數是調用每個類型的模板的每個特定的實例(我想這個模板有一個像轉換的方法(圖片< PIXEL_IN > const&,圖片< PIXEL_OUt >&)) – 2009-12-21 14:06:35

0

爲什麼不切換到OOP?你可以使用typeid()函數來獲取類型名稱和動態強制轉換。

+0

你能詳細解釋一下嗎? – UberJumper 2009-12-21 12:51:33

+0

我不明白你需要什麼。你能寫出巨型開關的樣子嗎? – marpetr 2009-12-21 13:56:19

+0

我正在使用OOP大開關將用於調用相應的構造函數。 – UberJumper 2009-12-21 14:28:20

0

也許使用類型列表可以幫助你。例如參見boost::mpl,或者簡單地說是boost/std :: tuple。這足以讓您從初始列表中生成所有類型對的列表。你的大開關可以通過遞歸模板元編程自動處理(即生成)(我不知道mpl是否有此功能)。然而,這不是微不足道的(我花了好幾個小時),所以如果你只需要處理這種情況,那麼在腳本語言的幫助下生成代碼可能會更快!

相關問題