我想要一個系統的設計,其中用戶可以將其自己的類定義爲多個預定義組件的聚合,然後讓此類工作與我提供的算法。我試圖用編譯時和/或基於模板的方法來做到這一點,而不是運行時多態或虛函數,因爲在這種情況下性能很重要。定義/使用從預設組件構建的類(在C++中)
例如,考慮我有許多可用於構建3D頂點的組件。我將定義這些組件爲位置,正常,顏色等,然後用戶將能夠(通過多重繼承,組合或什麼?)來定義一個頂點,如PositionAndColorVertex,它只有位置和顏色,但沒有正常。現在,我提供了一個功能,做一個百萬,這些頂點的矢量一些處理:
template<typename UsersVertexType>
void myProvidedAlgorithm(std::vector<UsersVertexType> input)
{
if(vertex has a position)
//do stuff with position
if(vertex has a normal)
//do stuff with normal
if(vertex has a color)
//do stuff with color
}
現在,我不知道UsersVertexType將是什麼樣子,但它會從我的組件來構建。我的功能需要對每個組件做些事情,但前提是它們存在。什麼是表達這種優雅和快速(編譯時間)的方式?
當然,我可以爲每種類型定義一個基類,讓用戶從所需基類繼承,然後使用dynamic_cast檢查哪些組件已實現,但這正是我想要的那種運行時方法避免。也許我可以在編譯時檢查這種繼承關係(編譯器應該知道UsersVertexType實際上是什麼,對吧?)。
也許我的組件應該用C++概念或策略表達?我也看到了mixin的討論,但不確定這些是否有用。用戶類應該使用多重繼承還是組合?也許我應該以某種方式將一組標誌放入用戶類中,指出它包含的內容?你將如何設計這個系統?
感謝您的任何見解!
說明:與我的previous question有相似之處,但我在此退一步尋找更高級別的設計選項/替代方案。
重塑Boost Graph Library? – sehe
在用戶類上設置標誌聽起來像個好主意。帶有OR的單個額外變量會檢查每個元素的標誌或更好,如果您檢查標誌組合,則直接檢查該數字。 – ivymike