1

这就是我想为最终用户实现的目标:

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

基本上,我希望最终用户通过将顶点类型作为参数传递来定义他想要的图元类型的顶点类型。

我有一个这样的模板网格类:

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

我希望上面的函数根据传递给函数的模板参数返回一个网格。

但是我很难构建这些功能,这就是我一直在尝试的:

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

有什么我想念的吗?我应该这样做吗?我知道我可以在函数上使用某种标志参数,但我认为模板方式对最终用户来说看起来更干净。

4

1 回答 1

1

专门化成员函数很好。但是,为了做到这一点,您不能直接在课堂上进行。尝试

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>(); }
于 2013-10-17T15:13:38.517 回答