如何在构造函数中的类成员数组中分配数组值,而无需使用STD库

How do you assign array values to class member array in constructor, without using the std library?

本文关键字:数组 STD 分配 构造函数 成员      更新时间:2023-10-16

试图理解将值复制到类成员数组中的正确方法。当前,我将数组的每个值都复制到成员数组的相应元素:

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库不是一个选择。

任何接受者?

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

如果您无法访问它,那么就不难像这样实现类。与原始阵列相比,这是一个直接的,具有较小语义的直接汇总。它也可能被重复使用,这使其成为您应该实施的实用程序的好候选者。

失败了,您可以依靠委派委员

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]...},它变成了初始化器,与您的原始器不同。请参阅Live

我知道我应该使用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];
};

然后,初始化IPAddressvalues数据成员变得更简单:

struct IPAddress
{
    IPAddress(const unsigned char values[4]) :
    values{values} {} // <-- copy as a whole
    values_t<const unsigned char, 4> values;
};