2013-04-17 109 views
5

我想要做的是創建一個接受任何類或結構(通過模板)的函數,但也有函數假定在傳入的類或結構中總是有特定的成員。我可以從模板訪問結構/類成員嗎?

在可能 - 不正確的代碼,它會是這個樣子:

template <class inputType> 
int doSomething(inputType voxel) 
{ 
    return voxel.density; 
} 

我希望它假定density成員將永遠存在,而且將永遠是一個int(或任何)。我可以這樣做嗎?如果是這樣,如果density不存在會發生什麼?它只會拋出一個編譯器錯誤?

回答

4

這是完全合法的,C++中的模板無法與其他方法(認爲Java)相比較,該類型通過保持類型變量來檢查泛型方法或類。

C++模板是使用每種可能的類型編譯的,因此每個特定類型的每個實例都會被編譯並進行類型檢查。如果您嘗試訪問未使用doSomething的類型中包含的字段,則會出現編譯器錯誤。

+0

哇!我問了3分鐘後你回答了我的問題!謝謝! (加上它正是我所希望的) – Clonkex

1

你絕對可以做到這一點,模板將在編譯時實例化,如果類型沒有該成員它不會編譯,你會收到和錯誤。模板函數基本上是合同,只要您使用的類型符合合同,那麼它將起作用。

在這種情況下,我也建議你嘗試一下,像LiveWorkSpace這樣的網站使用C/C++進行試驗非常簡單和無痛,無論你身在何處,它們都支持最新版本。通過嘗試這樣的事情你會學到更多東西。您可以在此前的thread中找到更多此類工具。

+0

謝謝,我會看看那個。我知道我應該在代碼_before_中試過這個問題,但這意味着要麼需要很多時間修改我的當前項目,要麼創建一個新項目來測試。這兩個選項都非常有吸引力。 (剛剛嘗試LiveWorkSpace和網站似乎已關閉。) – Clonkex

+0

@Clonkex我經常使用LiveWorkSpace,但我注意到它現在停下來,所以我添加了第二個鏈接,它也有很多其他選項。我通常不會建議某人只進行實驗,但您似乎有足夠的信息來成功解決問題,有時知道實驗的障礙低於您認爲可以提供的幫助。絕對; –

+0

絕對;如果我在發佈問題之前想過使用在線C++編譯器。我考慮創建一個新項目來測試它,但是後來我決定確保它實際上在C++中是允許的,即使編譯成功(它可能會編譯,但隨後會導致隱藏的問題)也可能會更好。感謝您的鏈接:) – Clonkex

相關問題