c – 基于模板参数有条件地定义模板类的构造函数
发布时间:2020-12-16 10:01:40 所属栏目:百科 来源:网络整理
导读:我有跟随类,用作通用“2D / 3D / etc空间中的点/向量”: templatesize_t dimensionclass Vector{private: std:arrayfloat,dimension data;public: //common vector operations etc inline float magnitude() const; inline Vectordimension normalized() co
我有跟随类,用作通用“2D / 3D / etc空间中的点/向量”:
template<size_t dimension> class Vector { private: std:array<float,dimension> data; public: //common vector operations etc inline float magnitude() const; inline Vector<dimension> normalized() const; inline static float dotProduct(const Vector<dimension>& left,const Vector<dimension>& right); //vector arithmetic operators etc inline Vector<dimension> &operator+=(const Vector<dimension> &other); inline Vector<dimension> &operator*=(float s); } 在这个类上有更多的运算符等,但为了简洁,我省略了大部分运算符.我的问题是,如何定义此类的构造函数? 当维度为2时,我想要一个带有2个参数的构造函数: 向量< 2> ::向量(float x,float y):data({x,y}){} 当维度为3时,我想要一个带有3个参数的构造函数: 向量< 3> ::向量(float x,float y,float z):data({x,y,z}){} 按照设计,此类支持任意维度,因此为每个维度创建特殊化并不是一种有吸引力的方法,也不是为每个支持的维度定义支持SFINAE的构造函数.如何为Vector< N>编写单个构造函数?它接受N个参数并将它们作为初始化列表传递给数据数组? 解决方法
这是你想要的?
template <typename ...Args,typename std::enable_if_t<dimension == sizeof...(Args),int> = 0> Vector(Args&& ...args) : data { std::forward<Args>(args)... } { } template <typename ...Args,typename std::enable_if_t<dimension != sizeof...(Args),int> = 0> Vector(Args&& ...args) { static_assert(sizeof...(Args) == dimension,"Dimension doesn't match parameter count"); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |