2010-08-02 87 views
0

我的工作在遊戲引擎的原型,並有以下問題:C++ - 設計問題

現在我的引擎實現的DirectX結合,一切工作正常。

我有一個core::Renderer類有方法來呈現幾何形狀,集着色器,閃電等...

他們中的一些模板,有些不是。

class Renderer { 

    // ... 
    template <typename Geometry> RenderGeometry(shared_ptr<Geometry> geometry); 
}; 

比方說,我想延長我的引擎的靈活性和我wan't它使用DirectX和OpenGL工作。據我現在的理解,這個想法是採取一切界面特定的基地core::Renderer類,使所有這些電話virtual,然後提供他們的特定於DirectX的OpenGL特定的實施。

如果我的幾何對象是不是一個模板,一切會更好看:

class Renderer { 

    virtual void RenderGeometry(shared_ptr<core::Non_template_Geometry> geometry); 

}; 

class DXRenderer { 

    // Here goes our custom implementation 
    // for DirectX-based geometry rendering 
    virtual void RenderGeometry(...) 
}; 

// The same for OpenGL 

與第一(初始變體)的問題是,虛函數不允許作爲模板。

所以在這裏談到的問題 - 我應該怎麼解決呢?

這種局面或模板虛擬功能仿真任何黑客/技巧/模式?

+0

「比方說,我想擴展靈活性」的建議:增加了靈活性是一個壞主意 - 會吃你的開發時間。除非必須,否則不要這樣做。額外的API支持也是如此。除非你無法支​​持額外的3D API,否則不要添加它。 – SigTerm 2010-08-02 23:52:39

+0

@SigTerm那麼,至少我想知道如何解決這類問題。而且,因爲這是一個愛好項目,我有很多時間:) – 2010-08-02 23:55:54

回答

2

使用一個基類Geometry

class Geometry { 
public: 
    virtual ~Geometry() { } 
    virtual void Render() = 0; 
}; 

,並有每個幾何型的類從這個基類派生,並通過覆蓋Render實現其特定的渲染功能。

然後,Renderer::RenderGeometry不需要是一個函數模板;它只需要一個指向基類Geometry的指針並調用虛擬函數Render

+0

不幸的是,有一些麻煩。幾何應該獨立於頂點類型,在我的情況下是另一個模板。我可能可以解決這個在'variant'類型上的操作,但我認爲有一個更好的解決方法。 *無論如何,謝謝。* – 2010-08-03 00:03:30

+0

@ HardCoder1986:您可以從基礎'Geometry'類派生任意數量的類型,因此您可以從'Geometry'派生出一個具體的類模板,該模板也將頂點類型作爲模板參數。 – 2010-08-03 00:05:28

+0

謝謝,我很蠢:)看起來我辛苦了一天...... – 2010-08-03 00:07:00

1

模板不是必需的。如果您認真思考,大部分時間模板只會進行文本替換,並且是更安全的宏。

OOP沒有設計在很大程度上依賴模板,但組成和繼承(像什麼詹姆斯建議)