gpt4 book ai didi

c++ - 如何初始化类中非平凡对象的 std::array ,其中数组的大小是类的模板参数?

转载 作者:行者123 更新时间:2023-12-02 07:09:17 24 4
gpt4 key购买 nike

假设我有一个如下所示的类

template<std::size_t NumThings>
class Bar
{
public:
Bar(const int& v) : m_v(v) {}

std::array<int,NumThings> GetThings() const
{
std::array<int,NumThings> things;
for(std::size_t i = 0; i < NumThings; ++i)
things[i] = m_v;
return things;
}

protected:
const int& m_v;
};

template<std::size_t NumItems, std::size_t NumPieces>
class Foo
{
public:
Foo(const int& initialValue)
:
m_array(/* what do I do to pass initialValue to each item? */)
{}

protected:
std::array<Bar<NumPieces>,NumItems> m_array;
};

我不确定如何通过传递参数来初始化 Foo 类中的 Bar 数组。我想我不能使用 {...} 类型的语法,因为我还不知道有多少项,但我确信我可以使用某种元模板编程技巧使用。

编辑使Bar的默认构造函数变得不可能。

最佳答案

没有标准函数来构造N的数组T 的实例。但你可以自己实现这个功能。实现这一目标的一种方法是形成 parameter pack与要初始化的数组的大小相同。然后,您可以在数组对象的初始值设定项列表中解压该参数包,以正确构造数组。这是一个例子:

#include <array>
#include <cstddef> // std::size_t
#include <utility> // std::index_sequence

namespace details {
template<class T, std::size_t ... I>
std::array<T, sizeof...(I)> make_array_impl(const T & p_Value, std::index_sequence<I...>)
{
return {
(I, p_Value)...
};
}
} // namespace details


template<std::size_t N, class T>
auto make_array(const T & p_Value)
{
return details::make_array_impl(p_Value, std::make_index_sequence<N>());
}

make_array函数转换模板参数 N使用 std::index_sequence 到参数包。例如,如果 N是 3,模板参数 I...对于 make_array_impl将是<0, 1, 2> .

然后,在 make_array_impl该参数包在 (I, p_value)... 中扩展。要扩展参数包,您必须以某种方式使用它。但我们实际上并不关心 I 的值,仅取决于它拥有多少个值。再说一遍,如果 N为 3,参数包将扩展为 return { (0, p_Value), (1, p_Value), (2, p_Value) }; 。应用逗号运算符,计算结果将相当于 return { p_Value, p_Value, p_Value }; .

您的情况的用法如下所示:

Foo(const int& initialValue) :
m_array(make_array<NumItems>(Bar<NumPieces>{ initialValue }))
{}

关于c++ - 如何初始化类中非平凡对象的 std::array ,其中数组的大小是类的模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58331605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com