专用向量模板的大括号初始化
brace initialization for specialized vector template
我有一个3D矢量模板
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
}
专用于double float和int
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标准)。
您的问题是,通过从Vec3TYPE
继承Vec3X
,您取消了将其作为聚合类型的资格,因此您不能像您希望的那样使用聚合初始化。解决这个问题的方法是使您的类型别名为相应的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++初始化向量;脚本化值不是数组、指针或矢量错误
- 在C++中初始化向量映射的最有效方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 用向量的向量元素初始化向量的空向量
- 初始化向量数组,其中每个向量的大小为 0
- 如何初始化向量<unordered_map<*,*>>
- 如何在元组初始化向量中删除样板?
- C++ 通过函数声明后初始化向量
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 使用所述填充构造函数初始化向量中的向量
- 制作可用于初始化向量的迭代器
- 如何使用sregex_token_iterator对象初始化向量
- 用空向量 c++ 的 M 元素初始化向量
- 用reference_wrapper本地初始化向量
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用 reference_wrappers 初始化向量
- 从不同类型的容器的迭代器初始化向量
- 在具有容量/调整大小的类中初始化向量
- 在头文件中声明和初始化向量
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量