温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Array of unknown length in constructor initializer list
c++ c++11 initialization

c++ - 构造函数初始化器列表中未知长度的数组

发布于 2020-03-27 10:35:31

我有一个带有成员数组的类。长度是一个常数,但是直到编译时才知道该常数(在我的实际代码中,对于不同的编译目标,此常数的定义不同)。数组的类型是没有默认构造函数的类。

#define CONSTANT 2

class Data {
public:
    Data(int number){}
};

class DemoClass {
private:
    Data _member[CONSTANT];
public:
    DemoClass():
        _member{
            Data(0),
            Data(0)
        }
    {
        // stuff
    }
};

在此示例中,我可以_member使用初始化列表进行设置但是,如果COSNTANT更改了值,则必须更改该初始化程序列表。

从理论上讲,更改DemoClass为具有默认构造函数,该默认构造函数使用参数调用另一个构造函数0将对我的情况有效,因为我将始终使用调用Data构造函数0但是,我无法更改,DemoClass因为它在外部库中。

我考虑过的一种解决方案是创建以下类:

class CustomData : public Data {
public:
    CustomData() : Data(0){}
};

这可行,但似乎有点复杂。有没有更简单的方法来初始化此数组?

查看更多

查看更多

提问者
ItsTimmy
被浏览
301
pptaszni 2019-07-03 21:34

我在这里找到了解决您问题的答案因此,在您的情况下,应按以下方式应用此解决方案:

#include <utility>
#include <array>

#define CONSTANT 2

class Data {
public:
    Data(int number){}
};

template<typename T, size_t...Ix, typename... Args>
std::array<T, sizeof...(Ix)> repeat(std::index_sequence<Ix...>, Args &&... args) {
   return {{((void)Ix, T(args...))...}};
}

template<typename T, size_t N>
class initialized_array: public std::array<T, N> {
public:
    template<typename... Args>
    initialized_array(Args &&... args)
        : std::array<T, N>(repeat<T>(std::make_index_sequence<N>(), std::forward<Args>(args)...)) {}
};

class DemoClass {
private:
    initialized_array<Data, CONSTANT> _member;
public:
    DemoClass():
        _member(1234)
    {
        // stuff
    }
};

然后,您_member将静态分配固定大小的数组。但是,该方法有点复杂,因此也许有人可以提供更清洁的解决方案。