gpt4 book ai didi

c++ - 专门 vector 模板的大括号初始化

转载 作者:搜寻专家 更新时间:2023-10-31 01:40:02 27 4
gpt4 key购买 nike

我有这个 3D vector 模板

template <class TYPE, class VEC> 
class Vec3TYPE{
public:
union{
struct{ TYPE x,y,z; };
struct{ TYPE a,b,c; };
TYPE array[3];
};
inline void set( const VEC& a ){ x=a.x; z=a.y; z=a.z; };
inline void add( const VEC& a ){ x+=a.x; z+=a.y; z+=a.z; };
// + some other methods .... doesn't matter
}

专门用于双 float 和整数

class Vec3i : public Vec3TYPE< int,    Vec3i > {  };
class Vec3f : public Vec3TYPE< float, Vec3f > { };
class Vec3d : public Vec3TYPE< double, Vec3d > { };

我想做以下事情:

用大括号初始化 Vec3d 数组,如下所示:

Vec3f myVec3fs[2] = { {1.0f,2.0f,3.0f}, {3.0f,2.0f,1.0f} };

将 {1.0f,2.0f,3.0f} 作为 Vec3f 类型的参数传递给函数,如下所示:

float someFunc( const Vec3f& a );
float result = someFunc( {1.0f,2.0f,3.0f} );

Vec3d myVec3f;
myVec3f.set( {3.0f,2.0f,1.0f} );
myVec3f.add( {1.0f,2.0f,3.0f} );

在我使用模板概括我的 Vec3 类之前(即当我从头开始定义 Vec3d 时),它工作得很好(至少对于 C++11 标准)。

最佳答案

你的问题是,通过让 Vec3X 继承自 Vec3TYPE,你就取消了它作为聚合类型的资格,所以你不能像你想的那样只使用聚合初始化.解决这个问题的方法是为相应的 Vec3Type 实例化你的类型别名:

//just take one template param, we can work out what the second was
template <class TYPE>
class Vec3TYPE{
//typedef VEC here
using VEC = Vec3TYPE<TYPE>;
//same as you had previously
};

//alias instead of inherit
using Vec3i = Vec3TYPE<int>;
using Vec3f = Vec3TYPE<float>;
using Vec3d = Vec3TYPE<double>;

关于c++ - 专门 vector 模板的大括号初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30344137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com