返回值的静态模板函数特化

时间:2013-10-17 14:58:26

标签: c++ templates

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

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

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

我有一个这样的模板化Mesh类:

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

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

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

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

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

但是这给了我:“非命名空间范围的显式特化”,所以我尝试了struct specialization方式:

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 个答案:

答案 0 :(得分: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>(); }