gpt4 book ai didi

c++ - 用它的索引范围打包元组

转载 作者:行者123 更新时间:2023-11-30 05:03:53 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以将元组与其索引范围打包(可能使用 std::index_sequence )。基本上,我想要实现的是

template <typename... Us, std::size_t... Idx>
void func(??? arg_pack) {
// std::get<Idx>(std::move(arg_pack.args))...
}

以下行不通,但表明了我的意图。

template <typename... Us, std::size_t... Idx>
struct arg_pack {
std::tuple<Us...> args;
std::index_sequence<Idx...> idx;
};

更新:

This是我实际采用的解决方案 sample usage .希望这能更清楚地说明我的意图。

最佳答案

双可变列表有一个常见的问题:可变参数的末尾只能有一个。

我建议将索引列表打包成一个类型(通常是 std::index_sequence )并将其放在首位。

我的意思是,像

template <typename...>
struct arg_pack;

template <std::size_t ... Is, typename ... Ts>
struct arg_pack<std::index_sequence<Is...>, Ts...>
{
static_assert( sizeof...(Is) == sizeof...(Ts) , "!" );

std::tuple<Ts...> args;
std::index_sequence<Is...> idx;
};

所以 func()可以这样写

template <std::size_t ... Is, typename ... Ts>
void func (arg_pack<std::index_sequence<Is...>, Ts...> && ap)
{
using unused = int[];

(void)unused { 0, (std::get<Is>(std::move(ap.args)), 0)... };
}

我还建议声明(不是定义,以 std::declval() 的方式……但您也可以创建一个 make_arg_pack() 以从 Ts... 值的列表开始创建对象)declArgPack()功能

template <typename ... Ts>
arg_pack<std::make_index_sequence<sizeof...(Ts)>, Ts...> declArgPack ();

简化类型的创建,以及模板的定义using类型,以简化 declArgPack() 的使用

template <typename ... Ts>
using arg_pack_type = decltype(declArgPack<Ts...>());

下面是一个完整的工作示例

#include <tuple>
#include <type_traits>

template <typename...>
struct arg_pack;

template <std::size_t ... Is, typename ... Ts>
struct arg_pack<std::index_sequence<Is...>, Ts...>
{
static_assert( sizeof...(Is) == sizeof...(Ts) , "!" );

std::tuple<Ts...> args;
std::index_sequence<Is...> idx;
};

template <typename ... Ts>
arg_pack<std::make_index_sequence<sizeof...(Ts)>, Ts...> declArgPack ();

template <typename ... Ts>
using arg_pack_type = decltype(declArgPack<Ts...>());

template <std::size_t ... Is, typename ... Ts>
void func (arg_pack<std::index_sequence<Is...>, Ts...> && ap)
{
using unused = int[];

(void)unused { 0, (std::get<Is>(std::move(ap.args)), 0)... };
}

int main ()
{
arg_pack_type<short, int, long, long long> ap0;

func(std::move(ap0));
}

关于c++ - 用它的索引范围打包元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49204863/

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