好的。模板魔术。
std::array<T, 5> arr = { one, two, three, four, five };
的想法是one
,...,five
是T型(在你的案件清单)的构造对象的五个人副本,使用:作为std::array
是一个聚合类型,它可以使用集合初始化进行初始化用户输入为参数。所以,让我们玩吧。别笑或者看完这个哭:
的想法是类型T的一个对象,并将其复制五次:
{ T(param), .... }; // Five repetitions.
所以,让我们创建返回已初始化数组功能:
std::array<A, 5> arr = create_array_by_copy<5>(A(10));
该函数将返回临时对象的array<A, 5>
与5
副本。
为此,我们将使用的辅助struct
其中将创建一个参数包用的5
的长度(参数化作为s
):
template<std::size_t s, class... voids_t>
struct sized_pack : public sized_pack<s - 1, voids_t..., void>
{};
template<class... voids_t>
struct sized_pack<0, voids_t...>
{};
这将创建一个参数包,称为voids_t
,这仅仅是列表s
void
s。而现在,诀窍的核心是:
template<std::size_t s, class T, class... pack_t>
std::array<T, s>
create_array_by_copy_helper(sized_pack<0, pack_t...> const&,
T const& o)
{ return { (pack_t(), o)... }; }
template<std::size_t s, class T>
std::array<T, s> create_array_by_copy(T const& o)
{
return create_array_by_copy_helper<s>(sized_pack<s>(), o);
}
这很复杂。我知道......因为我们已经将sized_pack<s>
类型的对象传递给助手函数,所以临时对象将实例化sized_pack
的层次结构,最后一个基类将是sized_pack<0, void, void, void, void, void>
类型的对象。
功能apply将接收该对象作为参考size_pack<0, pack_t...>
(最后一个基类,请注意第一个0),因此,pack_t
将是我们的5 void
s的列表。
最后,我们有:
(pack_t(), o)
它只是逗号操作符,所以,它返回o
。我们的想法是,我们在“模式”中插入pack_t
(参数包),因此,在将...
应用于表达式时,它将被逗号分隔的表达式替换,其中每个pack_t
外观将由参数组以相同的顺序,所以:
{ (pack_t(), o)... }
转化为:
{ (void(), o), (void(), o), (void(), o), (void(), o), (void(), o) }
初始化列表!最后,每个元素只是一个void
表达式,后跟昏迷操作符,每个对的第二个元素将由逗号运算符返回。因此,评估的表达式将为:
return { o, o, o, o, o }; // With its corresponding calls to `forward`.
我们希望的初始化列表!!
Coliru例如:
http://coliru.stacked-crooked.com/a/d6c4ab6c9b203130
你只需要与您的清单类取代型T
。
“每个列表的大小都是在构造时指定的常量” - 我衷心希望你的意思是在*编译时*,对吗?否则,你可以折腾从一开始就使用'std :: array'的想法。 –
WhozCraig
列表的大小不是编译时间常量。 – user1476176