【发布时间】:2020-02-29 15:47:50
【问题描述】:
我编写了一个简单的范围类来查看字节的向量(集合)。
using byte_vector = std::vector<uint8_t>;
template<typename Iter>
struct byte_range {
static_assert( sizeof( typename std::iterator_traits<Iter>::value_type )== 1);
using type = byte_range<Iter>;
Iter first;
Iter last;
Iter begin()const{ return first; }
Iter end()const{return last;}
byte_range()=default;
byte_range(Iter f, Iter l): first{f}, last{l} {}
byte_range(byte_vector&v) :byte_range(v.begin(),v.end()){}
byte_range(byte_vector const&v):byte_range(v.begin(),v.end()){}
};
template<typename C> byte_range(C&) -> byte_range<typename C::iterator>;
template<typename C> byte_range(C const&) -> byte_range<typename C::const_iterator>;
它可以从传递给构造函数的向量中推断出 Iter 类型。但我找到了同时处理非常量和常量的唯一方法。我想知道是否有办法为两者编写一个模板推导线。
我想将最后两行合并为一行。但是怎么做呢?
#include <iostream>
#include <vector>
int main()
{
using namespace std;
byte_vector bv {1,2,3,4,5};
byte_range bri(begin(bv),end(bv));
byte_range brv(bv);
cout<<"---"<<endl;
for(auto&br:{bri,brv}){
for(auto&b:br)
cout<<hex<<int(b)<<" ";
cout<<endl;
}
byte_vector const bvc = {6,7,8,9,0};
byte_range brc = bvc;
for(auto&b:brc)
cout<<hex<<int(b)<<" ";
cout<<endl;
}
【问题讨论】:
标签: c++