这里有一个经典的C++20解决方案:使用模板闭包,结合
std::integer_sequence
。
让我们通过使用通用引用和转发元组来稍微改进一下,以最大限度地减少副本数量。
以下示例不是定义元组,而是转发第一个
N
参数到另一个函数。
完全巧合的是,所讨论的函数是
std::make_tuple
那个生成一个元组。但是,任何函数都可以。
#include <tuple>
#include <utility>
#include <iostream>
#include <type_traits>
template<std::size_t N, typename ...Ts>
auto foo(Ts && ...ts)
{
auto all_elements=std::forward_as_tuple(
std::forward<Ts>(ts)...
);
return [&]<std::size_t ...I>(std::index_sequence<I...>)
{
return std::make_tuple(std::get<I>(all_elements)...);
}(
std::make_index_sequence<N>{}
);
}
int main()
{
auto t=foo<2>(3, "a", 0.1);
static_assert(std::is_same_v<decltype(t), std::tuple<int, const char*>>);
std::cout << std::get<0>(t) << " " << std::get<1>(t) << "\n";
}
(live demo)