如何使用数字序列解压可变参数模板参数?
如何(或者是否可以)使用数字序列解压参数包?例如,
template <typename C, typename... T>
C* init_from_tuple(bp::tuple tpl)
{
return new C{bp::extract<T>("magic"(tpl))...}; // <--
}
<--
行应扩展为
return new C{bp::extract<T0>(tpl[0]),
bp::extract<T1>(tpl[1]),
.....
bp::extract<Tn>(tpl[n])};
n == sizeof...(T) - 1
。
目的是为 Boost.Python 创建一个 __init__ 函数,它接受具有预定义类型的元组。
How to (or is it possible to) unpack a parameter pack with a numeric sequence? For example,
template <typename C, typename... T>
C* init_from_tuple(bp::tuple tpl)
{
return new C{bp::extract<T>("magic"(tpl))...}; // <--
}
which the <--
line should expand to
return new C{bp::extract<T0>(tpl[0]),
bp::extract<T1>(tpl[1]),
.....
bp::extract<Tn>(tpl[n])};
where n == sizeof...(T) - 1
.
The purpose is to create a __init__ function for Boost.Python which accepts a tuple with predefined types.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
实际上,解包操作可以同时针对两个不同的参数包(我认为它们需要具有相同的长度)。这里我们想要一组类型和一组数字。
类似于:
我们“只是”需要生成索引包:
然后使用它:
在 Ideone 上进行操作。
我们可以通过在
init_from_tuple_impl
的实现中犯下一个“错误”来见证正确性(例如删除new
):在 Ideone:
正是我们想要的:)
Actually, it is possible for the unpack operations to target two different packs of parameters at once (I think they need be of equal length). Here we would like a pack of types, and a pack of numbers.
Something akin to:
We "just" need to generate the pack of indices:
And then use it:
In action at Ideone.
We can witness the correctness by making a "mistake" in the implementation of
init_from_tuple_impl
(remove thenew
for example):In action at Ideone:
Exactly what we wanted :)
如果您首先将参数提取到它们自己的包中,然后调用构造函数,这是可能的。它还远未完成,但您已经了解了总体思路:
使用 boost 的
enable_if
使指示的位置仅在某些情况下启用,并且模板参数可能需要一些更改,但这只是一个开始。Its possible if you first extract the parameters into their own pack and then call the constructor. its far from finished, but you get the general idea:
Use boost's
enable_if
to make the places indicated only enabled in some cases, and probably the template arguments need some changes, but this is a start.