Il serait facile de faire une telle classe. Quelque chose comme ceci:
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_;
};
Cela ressemble à un tas de code, la plupart de ce n'est pas strictement nécessaire. Cependant, puisqu'il s'agit d'un modèle, le compilateur ne générera que du code pour les méthodes utilisées. Et la classe elle-même n'utilise que l'espace pour le pointeur et les membres de longueur.
Mais à la fin, ce n'est vraiment pas un grand avantage. Puisque les pointeurs eux-mêmes sont de bons pointeurs, j'utiliserais probablement juste des pointeurs bruts ici.
Cela ressemble à ce que je cherche. Je pensais que ce genre de chose serait assez commun pour être au moins boost :: cependant. La raison pour laquelle je voudrais faire un itérateur de la data/len est a) de le transporter en C++ (au dessus de l'API C), et b) d'utiliser facilement les templates et classes STL/boost existants . – NuSkooler