我有一个std :: tuple,我想在一个任意的编译时参数N处将其拆分。我已经看到了一些解决方案,它们像here,[C0 ]或here,但是它们不能解决我的问题,因为对于我来说,作为模板参数传递的此常量(如1)是运行时参数,并且违反了std :: index_sequence的目的。例如,像这样的东西是行不通的:
here
因此,我的问题是:这可能吗?例如,如果我可以从任意N开始有一个index_sequence,但是我找不到如何做的话,这会更简单。
您在附近。
您的错误是将#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()