如何通过扩展参数包和另一个类型列表来构建新类型?

问题描述 投票:0回答:1

我有一个参数打包函数,如下,

template<typename... Args>
void foo(const Args&... args)
{   
   bar( SomeClass<Args, ??> { args }... );
}

如果没有上面的

??
部分,这是一个正常的参数包扩展。

但是,我想要??是来自

typedef std::tuple<(a list of types computed somewhere else)> typeLists;
的类型,与参数包具有相同的顺序。

即,对于参数包中的第一种类型,??应该是

typeLists
等中的第一种类型

确保

typeLists
中的类型数量与参数包的大小相同。

有办法实现吗?我读过一些类似的问题,但没有一个是完全相同的。我认为可能需要使用

index_sequence
但我不确定如何使用。

非常感谢。

c++ c++17
1个回答
0
投票

我认为可能需要使用index_sequence,但我不确定 怎么办。

是的,使用

index_sequence
即可轻松完成此操作:

template<typename... Args, std::size_t... Is>
void foo(const Args&... args, std::index_sequence<Is...>)
{   
   using typeLists = std::tuple<Args...>;
   bar( SomeClass<Args, std::tuple_element_t<Is, typeLists>> { args }... );
}

template<typename... Args>
void foo(const Args&... args)
{   
   foo( args..., std::index_sequence_for<Args...>{} );
}
© www.soinside.com 2019 - 2024. All rights reserved.