我想创建一个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;
}
};
我不认为语句不是在编译时评估的,所以这只是我想做的事的例证。有什么办法吗?还是我必须专门处理每种类型,还是只重写所有不同的版本?
您可能需要某种vec3
和vec2
选择器类型。如果已经有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] 删除。
我来说两句