1

これは私がエンドユーザーのために達成したいことです:

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

基本的には、頂点タイプをパラメーターとして渡すことで、エンド ユーザーがプリミティブに必要な頂点タイプを定義する必要があります。

次のようなテンプレート化された Mesh クラスがあります。

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 に答える