变量,用于类模板的成员函数的参数个数

我只是在学习模板,并试图为矢量编写一个简单的模板类

template <unsigned N>
struct vec {
    std::array<float, N> m_buffer;

    float& operator[](unsigned index) { return m_buffer[index]; }

    vec(float value) {  std::fill(m_buffer.begin(), m_buffer.end(), value); }

    vec(float(&value)[N]) { std::copy(std::begin(value), std::end(value), std::begin(m_buffer)); }

    vec(float* value) {
        for (int i = 0; i < N; i++)
            m_buffer[i] = value[i];
    }

    float getmag() {
        float ret=0;
        for (int i = 0; i < N; i++)
            ret += m_buffer[N] * m_buffer[N];
        return sqrt(ret);
    }
};

int main() {    

    vec<3> a({ 1.0f, 2.0f, 3.0f });

    return 0;
}

现在,我想制作一个构造器,该构造器将使用N个浮点数并将它们分配给数组m_buffer,但没有找到任何方法。 通过专门化模板类,可以对某些N值完成此操作,但是对于任意数量的N怎么办?

评论
笪怀梦
笪怀梦

您可以使用可变参数模板:

template <unsigned N>
struct vec {
    std::array<float, N> m_buffer;

    template <typename ... Ts>
    vec(Ts... args) : m_buffer{{args...}} {}

// ...
};

可以添加SFINAE来检查Arity并将其限制为浮点可转换参数。

点赞
评论
[绿茶]
[绿茶]

You can just use an std::array<float, N> as a ctor parameter, as follows

#include <array>
#include <algorithm>

template <unsigned N>
struct vec {
    std::array<float, N> m_buffer;

    float& operator[](unsigned index) {
        return m_buffer[index];
    }
    //fill takes only one value, hence don't use it here
    //vec(float value) {  std::fill(m_buffer.begin(), m_buffer.end(), value); }

    vec(const std::array<float, N>& array) {
        std::copy(std::cbegin(array), std::cend(array), std::begin(m_buffer));
    }

};

int main() {

    vec<3> a({ 1.0f, 2.0f, 3.0f });

    return 0;
}
点赞
评论