gpt4 book ai didi

c++ - 如何用数字序列解压可变参数模板参数?

转载 作者:太空狗 更新时间:2023-10-29 21:06:13 26 4
gpt4 key购买 nike

如何(或是否可能)用数字序列解压参数包?例如,

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__ 函数,它接受具有预定义类型的元组。

最佳答案

实际上,解包操作可以同时针对两个不同的参数包(我认为它们的长度必须相等)。在这里,我们需要一组类型和一组数字。

类似于:

template <typename C, typename... T, size_t... N>
C* init_from_tuple_impl(bp::tuple tpl) {
return new C{ bp::extract<T>(tpl[N])... };
}

我们“只是”需要生成索引包:

template <size_t... N> struct Collection {};

template <typename C> struct ExtendCollection;

template <size_t... N>
struct ExtendCollection< Collection<N...> > {
typedef Collection<N..., sizeof...(N)> type;
};

template <typename... T>
struct GenerateCollection;

template <>
struct GenerateCollection<> { typedef Collection<> type; };

template <typename T0, typename... T>
struct GenerateCollection<T0, T...> {
typedef typename ExtendCollection<
typename GenerateCollection<T...>::type
>::type type;
};

然后使用它:

template <typename C, typename... T, size_t... N>
C* init_from_tuple_impl(bp::tuple tpl, Collection<N...>) {
return new C { bp::extract<T>(tpl[N])... };
}

template <typename C, typename... T>
C* init_from_tuple(bp::tuple tpl) {
typename GenerateCollection<T...>::type collection;
return init_from_tuple_impl<C, T...>(tpl, collection);
}

正在执行 Ideone .

我们可以通过在 init_from_tuple_impl 的实现中犯一个“错误”来证明正确性(例如删除 new):

template <typename C, typename... T, size_t... N>
C* init_from_tuple_impl(bp::tuple tpl, Collection<N...>) {
return C { bp::extract<T>(tpl[N])... };
}

正在执行 Ideone :

prog.cpp: In function 'C* init_from_tuple_impl(bp::tuple, Collection<N ...>)
[with
C = bp::Object,
T = {int, float, char},
unsigned int ...N = {0u, 1u, 2u},
bp::tuple = std::basic_string<char>
]':

正是我们想要的:)

关于c++ - 如何用数字序列解压可变参数模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027952/

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