在任意索引上分割一个std :: tuple

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

我有一个std :: tuple,我想在一个任意的编译时参数N处将其拆分。我已经看到了一些解决方案,它们像here,[C0 ]或here,但是它们不能解决我的问题,因为对于我来说,作为模板参数传递的此常量(如1)是运行时参数,并且违反了std :: index_sequence的目的。例如,像这样的东西是行不通的:

here

因此,我的问题是:这可能吗?例如,如果我可以从任意N开始有一个index_sequence,但是我找不到如何做的话,这会更简单。

c++ c++14 variadic-templates stdtuple
1个回答
0
投票

您在附近。

您的错误是将#include <iostream> #include <tuple> #include <utility> template < typename T , typename... Ts > auto head( std::tuple<T,Ts...> t ) { return std::get<0>(t); } template <std::size_t... Ns , typename... Ts> auto tail_impl( std::index_sequence<Ns...> , std::tuple<Ts...> t, std::size_t N) { return std::make_tuple( std::get<Ns + N>(t)... ); } template < std::size_t N, typename... Ts> auto tail( std::tuple<Ts...> t) { return tail_impl( std::make_index_sequence<sizeof...(Ts) - N>() , t, N); } int main() { auto t = std::make_tuple( 2, 3.14 , 'c' , 5); std::cout << std::get<0>( tail<2>(t) ) << std::endl; } 作为参数从N传递到tail()

您应该将其作为模板参数传递

tail_impl()

并且template < std::size_t N, typename... Ts> auto tail( std::tuple<Ts...> t) { return tail_impl<N>( std::make_index_sequence<sizeof...(Ts) - N>() , t); } 成为

tail_impl()
© www.soinside.com 2019 - 2024. All rights reserved.