これは私がエンドユーザーのために達成したいことです:
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を使用した両方の方法
足りないものはありますか?これを行うべき別の方法はありますか?関数に何らかのフラグ パラメーターを設定できることはわかっていますが、テンプレートの方法はエンド ユーザーにとってよりきれいに見えると思います。