Lin*_*gxi 1 c++ template-meta-programming variadic-templates c++14
我有一对begin()/ end()方法声明如下:
template <typename... Ts>
Iterator begin(Ts... indices) const;
template <typename... Ts>
Iterator end(Ts... indices) const;
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,end()可以实现begin().具体来说,end(x, y, ..., z)相当于begin(x, y, ..., z + 1).那么,有没有一个干净的方式转x, y, ..., z成x, y, ..., z + 1用indices,这样我就可以实现end()像
template <typename... Ts>
Iterator end(Ts... indices) const {
return begin(whatever to do with indices...);
}
Run Code Online (Sandbox Code Playgroud)
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...);
}
Run Code Online (Sandbox Code Playgroud)
只需添加一些完美的转发和隐私.
使用C++ 14但相对容易实现部件.
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |