如何在不使用std库的情况下将数组值分配给构造函数中的类成员数组?

时间:2018-02-06 09:06:53

标签: c++ arrays

尝试理解将值复制到类成员数组的正确方法。目前,我获取数组的每个值并将它们复制到成员数组的相应元素中:

struct IPAddress
{
    IPAddress(const unsigned char values[4]) :
    values{values[0], values[1], values[2], values[3]}
    {
    }

    const unsigned char values[4];
};

int main(int argc, char** argv)
{

    unsigned char values[] = {10, 0, 0, 1};
    IPAddress address(values);
    return 0;
}

这有效,但有没有办法“自动”复制构造函数中的所有值?我的意思是,如果一个类的值有100个元素而不是4个,我该怎么办?还是1000?

我知道我应该使用std::array。但由于此代码是为微控制器构建的,因此使用std库并不是一种选择。

任何参赛者?

2 个答案:

答案 0 :(得分:3)

您应该使用std::array。这是标准库的一部分,不应该冒犯嵌入式编程。

如果您无法访问它,那么实现类似的并不困难。它是一个比原始数组具有更健全语义的直接聚合。它也可能被重用,这使它成为应该实现的实用程序的良好候选者。

如果做不到这一点,你可以依靠委托c'我只在这里为智力练习添加:

struct IPAddress
{
    IPAddress(const unsigned char values[4])
      : IPAddress(values, std::make_index_sequence<4>{})
    {
    }

    const unsigned char values[4];

private:
    template<std::size_t... I>
    IPAddress(const unsigned char values[4], std::index_sequence<I...>)
    : values{values[I]...}
    {
    }
};

密钥在包扩展values{values[I]...}中,它变成了一个与原始扩展器不同的初始化器。 See it live

答案 1 :(得分:2)

  

我知道我应该使用std::array。但由于此代码是为微控制器构建的,因此使用std库并不是一种选择。

如果您不想加入array,您仍然可以实施自己的类型来解决问题:

template<typename T, std::size_t N>
class values_t {
public:
    values_t(const T *ptr) {
        // copy N elements
        for (std::size_t i = 0; i < N; ++i)
            value[i] = ptr[i]; // copy element
    }

    T& operator[](int i) { return value[i]; }
    const T& operator[](int i) const { return value[i]; }

private:
    typename std::remove_const<T>::type value[N];
};

然后,初始化values的{​​{1}}数据成员变得更加简单:

IPAddress