分割可变参数模板参数
如何将可变参数模板参数分成两半?像这样的东西:
template <int d> struct a {
std::array <int, d> p, q;
template <typename ... T> a (T ... t) : p ({half of t...}), q ({other half of t...}) {}
};
How do I split variadic template arguments in two halves? Something like:
template <int d> struct a {
std::array <int, d> p, q;
template <typename ... T> a (T ... t) : p ({half of t...}), q ({other half of t...}) {}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Luc 的解决方案简洁明了,但非常缺乏乐趣。
因为只有一种正确的方法来使用可变参数模板,那就是滥用它们来做疯狂的、过于复杂的元编程的东西:)
像这样:
它很短,除了我们需要编写一些助手:
首先我们需要结构 make_pack_indices,它用于在编译时生成一系列整数。例如
make_pack_indices<5, 0>::type
实际上是类型pack_indices<0, 1, 2, 3, 4>
我们还需要一个 get() 函数,与元组的 std::get 非常相似,例如 std::get(ts...) 返回参数包的第 N 个元素。
但是要构建 get(),我们还需要一个 pack_element 辅助结构,同样与 std::tuple_element 非常相似,例如
pack_element::type
是第 N 种类型参数包。我们开始吧。
实际上我不太明白为什么 pack_element 和 get() 不在标准库中。这些助手存在于 std::tuple 中,为什么不存在于参数 pack 中?
注意:我的 pack_element 和 make_pack_indices 实现是 libc++ 中 std::tuple_element 和 __make_tuple_indices 实现的直接转置。
Luc's solution is clean and straightforward, but sorely lacks fun.
Because there is only one proper way to use variadic templates and it is to abuse them to do crazy overcomplicated metaprogramming stuff :)
Like this :
It is quite short, except that we need to code some helper :
First we need the structure make_pack_indices, which is used to generate a range of integer at compile-time. For example
make_pack_indices<5, 0>::type
is actually the typepack_indices<0, 1, 2, 3, 4>
We also need a get() function, very similar to std::get for tuple, such as
std::get<N>(ts...)
return the Nth element of a parameters pack.But to build get() we also need a pack_element helper structure, again very similar to std::tuple_element, such as
pack_element<N, Ts...>::type
is the Nth type of the parameters pack.And here we go.
Actually I don't really understand why pack_element and get() are not in the standard library already. Those helpers are present for std::tuple, why not for parameters pack ?
Note : My implementation of pack_element and make_pack_indices is a direct transposition of std::tuple_element and __make_tuple_indices implementation found in libc++.
我们仍然缺乏很多助手来操作可变参数包(或者我不知道它们)。在一个好的 Boost 库将它们带给我们之前,我们仍然可以编写自己的库。
例如,如果您愿意将数组的初始化推迟到构造函数主体,则可以创建并使用一个将部分参数包复制到输出迭代器的函数:
如您所见,您可以(不那么)轻松地创建您的数组。自己的算法来操作参数包;所需要的只是对递归和模式匹配的良好理解(与进行模板元编程时一样)。
We still lack a lot of helpers to manipulate variadic parameter packs (or I am not aware of them). Until a nice Boost library brings them to us, we can still write our own.
For example, if you are willing to postpone your array's initialization to the constructor body, you can create and use a function that copies part of the parameter pack to an output iterator:
As you can see, you can (not so) easily create your own algorithms to manipulate parameter packs; all is needed is a good understanding of recursion and pattern matching (as always when doing Template MetaProgramming).
请注意,在这种特殊情况下,您可以使用
std::initializer_list
:Note that in this particular case, you may use
std::initializer_list
:这是另一个解决方案:
Here is yet another solution:
我知道这个问题很老了,但我昨天在寻找一个非常类似问题的解决方案时才发现它。我自己制定了一个解决方案,并最终编写了一个小型库,我相信它可以满足您的需求。您可以在此处找到说明如果您仍然感兴趣。
I know this question is quite old, but I found it only yesterday while looking for a solution to a very similar problem. I worked out a solution myself and ended up writing a small library which I believe does what you want. You can find a description here if you are still interested.