gpt4 book ai didi

c++ - 拆分参数包

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:55 25 4
gpt4 key购买 nike

我想拆分一个模板参数包。像这样的东西。我该怎么做呢?

template< typename... Pack >
struct TypeB : public TypeA< get<0, sizeof...(Pack)/2>(Pack...) >
, public TypeA< get<sizeof...(Pack)/2, sizeof...(Pack)>(Pack...) >
{
};

以下是我对为什么这个问题不重复的看法:我正在寻找一种通用的方法来执行此操作,它将在将拆分包传递给其他模板类时起作用——如上所示。以及将其传递给函数。

最佳答案

std::tuple (C++11) std::index_sequence (C++14, but there are backports) , 标准库包含了所有可以高效且方便地拆分包的东西。

template <class, class, class>
struct TypeBImpl;
template <std::size_t... N, std::size_t... M, class T>
struct TypeBImpl<std::index_sequence<N...>, std::index_sequence<M...>, T>
: TypeA<typename std::tuple_element_t<T, N>::type...>
, TypeA<typename std::tuple_element_t<T, M + sizeof...(N)>::type...>
{};

template <class... Ts>
struct TypeB
: TypeBImpl<
std::make_index_sequence<sizeof...(Ts) / 2>,
std::make_index_sequence<(sizeof...(Ts) + 1) / 2>,
std::tuple<std::enable_if<1, Ts>...>
>
{};

为了方便起见,我使用了一个中间基础,它具有保留辅助类型以供在成员中重复使用的额外优势。


如果你不需要它,或者它存在于 RTTI 中不方便,还有其他解决方案:

template <class T, std::size_t N, std::size_t... M>
auto TypeA_part_impl(std::index_sequence<M...>)
-> TypeA<typename std::tuple_element_t<T, N + M>::type...>;

template <bool tail, class... Ts>
using TypeA_part = decltype(TypeA_part_impl<
std::tuple<std::enable_if<1, Ts>...>,
tail * sizeof...(Ts) / 2>(
std::make_index_sequence<(sizeof...(Ts) + tail) / 2>()));

template <class... Ts>
struct TypeB : TypeA_part<0, Ts...>, TypeA_part<1, Ts...>
{
};

我正在使用 std::enable_if<1, T>作为传输任意类型信息的便捷工具,即使类型非常不规则,也无法存储在 std::tuple 中,或者是不完整的。无需定义我自己的。

关于c++ - 拆分参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55884200/

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