加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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");
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读