如何使用C ++模板参数来确定类中的成员类型

斑马鱼

我想创建一个Vertex类,并希望能够创建32位浮点型和64位double版本,甚至可能是int版本来对其进行通用化。我想这样做:

template <typename P>
struct Vertex
{
    if (typeid(P) == typeid(float))
    {
         vec3 position;
         vec3 normal;
         vec2 texcoords;
    }
    else if (typeid(P) == typeid(double))
    {
         dvec3 position; // This is a double vector
         dvec3 normal;
         dvec2 texcoords;
    }
    else if (typeid(P) == typeid(int))
    {
         ivec3 position; // This is an integer vector
         ivec3 normal;
         ivec2 texcoords;
    }

};

我不认为语句不是在编译时评估的,所以这只是我想做的事的例证。有什么办法吗?还是我必须专门处理每种类型,还是只重写所有不同的版本?

贾斯汀

您可能需要某种vec3vec2选择器类型。如果已经有vec3和的模板版本vec2,请使用它们。否则,您可以使用模板专门化:

template <typename T>
struct vec_selector {};

template <>
struct vec_selector<float> {
    using vec3_type = vec3;
    using vec2_type = vec2;
};

template <>
struct vec_selector<double> {
    using vec3_type = dvec3;
    using vec2_type = dvec2;
};

template <>
struct vec_selector<int> {
    using vec3_type = ivec3;
    using vec2_type = ivec2;
};

template <typename P>
using vec3_select_t = typename vec_selector<P>::vec3_type;

template <typename P>
using vec2_select_t = typename vec_selector<P>::vec2_type;

然后,您可以简单地编写:

template <typename P>
struct Vertex
{
    vec3_select_t<P> position;
    vec3_select_t<P> normal;
    vec2_select_t<P> texcoords;
};

您也可以只是专门化Vertex模板,但是在vec3_select_t其他地方使用它似乎很有用,并且您必须在其上重复任何成员函数Vertex(否则会使代码更复杂)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何确定从类模板继承的模板参数的基础模板类型?

使用模板参数中的成员类型

在C ++中确定模板参数的类型

(在Scala中)可以使用类的泛型类型参数来完成,而不能使用抽象类型成员来完成吗?

如何使用模板参数成员的类型?

operator << C ++中模板类中成员类型的重载

使用类外部的模板类中的typedef成员作为成员函数的返回类型

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

如何使用Clang获取模板类型的类成员的实际类型?

如何在C ++中为多个类类型指定相同的模板化成员函数?

在模板参数列表中使用decltype推断指向类成员的指针的类型

使用可变参数类模板类型的成员函数的结果初始化数组吗?

如何使用模板模板参数类型的引用类型模板参数定义类模板

在自己的成员函数中构造类时,如何强制类模板参数推导?

如何在类型依赖于派生类的基础模板类中声明成员?

C ++:如何在类成员中使用未命名的模板参数?

如何使用type_traits仅在特定类型上添加模板类的成员函数。C ++

如何使用C中没有参数且没有返回类型的函数来更新变量

如何定义可变参数类模板的成员模板功能

如何使用模板类型作为函数参数派生抽象模板类(C ++ 11)

Ruby - 使用 nil 参数来支持不同类型的类

如何从成员指针模板类型获取类类型

使用参数实例化模板类的类成员的正确方法

模板声明中省略了 c++ 类型参数。但是,在成员函数的定义中呢?

C ++-无法将默认参数添加到类模板成员的离线定义中

C ++中的模板类型成员变量

各种参数类型的C ++类模板方法

如何检查类型是否从模板函数中的某个可变参数模板类实例化?

使用“类”或“类型名”作为模板参数?