std ::未知大小的数组作为类成员

时间:2015-08-22 00:16:14

标签: c++ arrays

我正在制作N维图像格式,我想将原始数据存储在

std::array<T, multiple of all dimensions>* where T is the type of single channel pixel value

我希望构造函数采用像{20,30,50}这样的通道数组来制作一个20x30x50的位图,这样可以使数据的总长度达到30000.最后,我希望能够声明像这样的频道

auto* channelRed = new Channel<uint32_t>({20, 30, 50});

问题是std :: array要求在模板参数中传递大小,这会在我的N维计划中引发一个问题。

如何在我的类中将std :: array指针设置为类字段,以便在构造函数执行期间定义数组的长度?

PS!是的,我知道我可以很容易地使用一个常规阵列,这就是我现在正在做的事情。我只想弄清楚什么是std :: array。

2 个答案:

答案 0 :(得分:7)

你不能。 std::array必须在编译时知道它的大小。它是该类型的一部分! std::array<int, 2>std::array<int, 3>不是不同的尺寸,它们的类型完全不同。

您需要的是动态大小的数组,而不是静态大小的数组。即:std::vector<uint32_t>

template <typename T>
class Channel {
    std::vector<T> v;

public:
    Channel(std::initializer_list<T> dims)
    : v(std::accumulate(dims.begin(), dims.end(), size_t{1}, 
                        std::multiplies<size_t>{}))
    { }
};

答案 1 :(得分:-1)

如果您在编译时知道参数数量并希望基于此构建Channel,则可以使用数组(以及辅助函数)来完成此操作。

您可以像这样定义您的类:

template <typename Array>
class Channel {
    Array a;

public:
    Channel(Array arr)
    : a(arr)
    { }
};

然后有一个辅助函数来处理类型讨厌(基于this make_array):

template<class T, class... Tail>
auto make_channel(T head, Tail... tail) -> Channel<std::array<T, 1 + sizeof...(Tail)>>
{
     return Channel<std::array<T, 1 + sizeof...(Tail)>>({ head, tail ... });
}

然后在您的程序中,您可以执行以下操作:

auto channelRed = make_channel<uint32_t>(20, 30, 50);

您将获得一个Channel,其数组包含{20, 30, 50}