C++ 操纵可变函数模板的函数参数

C++ 操纵可变函数模板的函数参数,c++,c++14,variadic-templates,template-meta-programming,C++,C++14,Variadic Templates,Template Meta Programming,我有一对begin()/end()方法声明如下: template <typename... Ts> Iterator begin(Ts... indices) const; template <typename... Ts> Iterator end(Ts... indices) const; 模板 迭代器end_impl(std::index_序列,Ts…index)常量{ 自动tup=std::tie(索引…); 返回开始(std::get(tup)…,std:

我有一对
begin()
/
end()
方法声明如下:

template <typename... Ts>
Iterator begin(Ts... indices) const;

template <typename... Ts>
Iterator end(Ts... indices) const;
模板
迭代器end_impl(std::index_序列,Ts…index)常量{
自动tup=std::tie(索引…);
返回开始(std::get(tup)…,std::get(tup)+1);
}
模板
迭代器结束(Ts…索引)常量{
返回end_impl(std::make_index_sequence{},index…);
}
只需添加一些完美的转发和隐私

使用C++14,但相对容易实现部分。

模板
迭代器end_impl(std::index_序列,Ts…index)常量{
自动tup=std::tie(索引…);
返回开始(std::get(tup)…,std::get(tup)+1);
}
模板
迭代器结束(Ts…索引)常量{
返回end_impl(std::make_index_sequence{},index…);
}
只需添加一些完美的转发和隐私


使用C++14,但相对容易实现部分。

我可能刚刚做了
索引+(Is==sizeof…(Is)-1?0:1)
(并在
结束
中相应地为使用
索引序列),但这更多的是一个风格问题。不需要完美的转发,因为
Ts..
都是简单的整数类型。这个解决方案真是太棒了@T.C.我更赞成你的解决方案,其中参数不经过
std::tuple
@T.C.。顺便说一句,它应该是
index+(Is==sizeof…(Is)-1?1:0)
。@Lingxi Right。这就是我不运行它所得到的结果:/我可能刚刚做了
index+(Is==sizeof…(Is)-1?0:1)
(并在
end
中相应地使用
index\u sequence\u表示
),但这更多的是风格问题。不需要完美的转发,因为
Ts…
都是简单的整数类型。这个解决方案真是太棒了@T.C.我更赞成你的解决方案,其中参数不经过
std::tuple
@T.C.。顺便说一句,它应该是
index+(Is==sizeof…(Is)-1?1:0)
。@Lingxi Right。这就是我没有运行它的原因:/
template <typename... Ts>
Iterator end(Ts... indices) const {
  return begin(whatever to do with indices...);
}
template <std::size_t...Is,class... Ts>
Iterator end_impl(std::index_sequence<Is...>,Ts... indices) const{
  auto tup=std::tie(indices...);
  return begin(std::get<Is>(tup)..., std::get<sizeof...(Ts)-1>(tup)+1);
}
template <class... Ts>
Iterator end(Ts... indices) const{
  return end_impl(std::make_index_sequence<sizeof...(Ts)-1>{}, indices...);
}