2013-10-17 157 views
1

這就是我要實現對最終用戶是什麼:靜態模板功能專業化值

auto spherePos = Primitive::createSphere<VertexPosition>(); 
auto spherePosNormTex = Primitive::createSphere<VertexPositionNormalTexture>(); 

基本上我想最終用戶通過傳遞來定義他想要爲他的原始什麼樣的頂點類型的頂點類型作爲參數。

我有一個模板網類是這樣的:

template<typename VertexType> 
class Mesh 
{ 
    std::vector<VertexType> _vertices; 
    ... 
} 

,我想上述功能根據傳遞給函數模板參數返回一個網。

,但有一個困難時期建立這些功能IM,這是我一直想:

class Primitive 
{ 
    template<typename VertexType> 
    static Mesh<VertexType> createSphere(); 

    // specialization for the position only sphere 
    template<> 
    static Mesh<VertexPosition> createSphere<VertexPosition>(){ ... } 
} 

,但是這給了我:「在非命名空間範圍明確的專業化」,所以我嘗試的結構專業化方式:

class Primitive 
{ 
    template<typename VertexType> 
    struct Sphere 
    { 
     static Mesh<VertexType> create(); 
    } 

    template<> 
    struct Sphere<VertexPosition> 
    { 
     static Mesh<Position> create(){ ... } 
    } 

    template<typename T> 
    static Mesh<T> createSphere(){ return Sphere<T>::create(); } 
} 

但是,這再次給了我同樣的錯誤:「明確的專業化非命名空間內」,用gcc 4.8

兩種方式有什麼我錯過了?有另外一種方法我應該這樣做嗎? 我知道我可以在函數上使用某種標誌參數,但我認爲模板方式對於最終用戶來說看起來更乾淨。

+1

不要專門化您的會員; *超載*他們。不幸的是,你沒有參數,所以這不會很容易發生,因爲只有返回類型不同纔是不夠的。 (並且所有的結構都需要尾巴 - 分號,順便說一句)。 – WhozCraig

+0

謝謝。是的,我想過重了他們,但因爲我沒有任何參數它很難。我可以開始將函數命名爲「createSpherePosition()」「createSpherePositionNormal()」,但不知何故,我認爲它看起來比我試圖實現的(返回類型的專門化)更醜陋。至於分號,班也錯過了,我寫這個匆忙:p – sap

+1

+1的問題,順便說一句。包含所有問題,你想要達成什麼,你嘗試過什麼,以及你對兩者的觀察結果。 – WhozCraig

回答

2

專門的成員函數很好。但是,爲了做到這一點,你不能在課堂上直接做到這一點。嘗試

class Primitive 
{ 
public: 
    template<typename VertexType> 
    static Mesh<VertexType> createSphere(); 
}; 

// specialization for the position only sphere 
template<> 
Mesh<VertexPosition> Primitive::createSphere<VertexPosition>(){ return Mesh<VertexPosition>(); } 
+0

非常感謝,它現在工作正常:) – sap

+0

+1這應該工作。我在第二次執行時如此掛斷,我甚至沒有回到原來的問題。不錯的工作! – WhozCraig

+0

是的,學習永不停止+1 –