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

时间:2016-01-28 02:41:56

标签: 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()可以begin()来实现。具体而言,end(x, y, ..., z)相当于begin(x, y, ..., z + 1)。那么,是否有一种干净的方法可以使用x, y, ..., zx, y, ..., z + 1变为indices,以便我可以实现end()

template <typename... Ts>
Iterator end(Ts... indices) const {
  return begin(whatever to do with indices...);
}

1 个答案:

答案 0 :(得分:5)

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...);
}

只需添加一些完美的转发和隐私。

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