我有一个传递const char *和长度的基础API:
foo(const char* data, const uint32_t len);
我想将这个数据/长度包装在一个可以重复的轻量级容器中,并且能够随机访问但不能复制(例如像矢量)。实现这一目标的最佳方法是什么? const char *数据不一定是'字符串';它可能包含NULL。
我正在使用STL和Boost。我见过boost :: as_array<>和as_literal<> - 这是合适的吗?
答案 0 :(得分:4)
制作这样的课很容易。像这样:
template <class T>
class array_ref {
public:
// makes it work with iterator traits..
typedef T value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T* iterator;
typedef T& reference;
typedef const T* const_pointer;
typedef const T* const_iterator;
typedef const T& const_reference;
public:
array_ref(T *p, size_t n) : data_(p), len_(n) {}
// iteration
iterator begin() { return data_; }
iterator end() { return data_ + len_; }
const_iterator begin() const { return data_; }
const_iterator end() const { return data_ + len_; }
// access
reference operator[](size_t n) { return data_[n]; }
reference at(size_t n) { return data_[n]; }
const_reference operator[](size_t n) const { return data_[n]; }
const_reference at(size_t n) const { return data_[n]; }
// capacity
size_t size() const { return len_; }
bool empty() const { return size() == 0; }
// raw access
T* data() const { return data_; }
// etc...
private:
T* data_;
size_t len_;
};
这看起来像一堆代码,大部分都不是绝对必要的。但是,由于它是一个模板,编译器只会为使用的方法生成代码。而实际的类本身只使用空间作为指针和长度成员。
但最终,这真的不是一个好处。由于指针本身是很好的指针,我可能只是在这里使用原始指针。
答案 1 :(得分:2)
我已将iterator_facade http://www.boost.org/doc/libs/1_43_0/libs/iterator/doc/iterator_facade.html与iterator_range
一起使用您可以轻松使用iterator_range构建包装器http://www.boost.org/doc/libs/1_42_0/libs/range/doc/utility_class.html#iter_range
boost::iterator_range<char*> range(begin, begin + N);
可以使用iterator_facade
处理特殊情况答案 2 :(得分:0)
我不认为as_array和/或as_literal会做你想做的事。虽然编写起来并不是非常困难,但我不知道现有的课程是否打算做你想做的事情(或者至少我认为你想要的)。
编辑:我可能不应该说我不知道任何这样的类 - 我只是不知道任何特别熟知,广泛使用或经过全面测试的。如果您搜索comp.lang.c ++和/或comp.lang.c ++。的档案,比如12到15年前左右,你可能会找到至少十几个(至少提供谷歌的新闻组搜索正在工作)在这一刻)。除非记忆力让我特别糟糕,否则我会在某个地方张贴一个(尽管我现在似乎无法找到它......)然而,你可能从他们的年龄开始猜测,你可能不会想要使用最多(任何?)他们原样 - 他们使用C ++通常很原始。