컴파일 타임에 크기를 알 수있는 배열이 필요합니다. 나는 std :: vector 또는 boost :: array을 사용할 수 있다는 것을 알고있다. 하지만 그것이 내적으로 어떻게 작동하는지 가르쳐주지는 않습니다. 또한 이니셜 라이저를 사용하는 것 이외에 boost :: array에 항목을 추가하는 방법을 찾을 수 없습니다. generic 배열에 대해 다음 코드를 작성했습니다. 내 의도는 이터레이터, 템플릿 전문화 등을 익히는 것입니다. 다음은 코드입니다.반복자를 지원하는 일반 고정 크기 배열 구현
template<typename T>
struct iterator_traits
{
typedef T value_type;
typedef T& reference_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};
template<typename T>
struct iterator_traits<T*>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** iterator;
typedef const T const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};
template<typename T, size_t size = 10>
class Array
{
public:
typedef typename iterator_traits<T>::value_type value_type;
typedef typename iterator_traits<T>::reference_type reference_type;
typedef typename iterator_traits<T>::iterator iterator;
typedef typename iterator_traits<T>::const_iterator const_iterator;
typedef typename iterator_traits<T>::reverse_iterator reverse_iterator;
Array() : lastIndex(0) {
}
void add(value_type element) {
if(lastIndex >= size)
throw std::out_of_range("Array is full");
array_[lastIndex++] = element;
}
reference_type at(unsigned int index){
if(index < size)
return array_[index];
else
throw std::out_of_range("Invalid index");
}
size_t capacity(){
return size;
}
iterator begin(){
return array_;
}
iterator end(){
return array_ + size;
}
const_iterator begin() const{
return array_;
}
const_iterator end() const{
return array_ + size;
}
reverse_iterator rbegin() {
return reverse_iterator(end());
}
reverse_iterator rend() {
return reverse_iterator(begin());
}
private:
value_type array_[size];
unsigned int lastIndex;
};
위의 코드는 잘 작동합니다. 다음은 내 질문입니다
1 - boost :: array과 같은 배열을 어떻게 만듭니 까? 비슷한 것
Array<int> ints = { 10, 12 };
2 - 코드에 함정이 있습니까?
3 - 특성의 포인터 유형에 특수화를 사용해야했습니다. 그게 최선의 관행입니까?
4 - 반복자 패턴이 올바르게 구현 되었습니까? 아니요?
어떤 생각이라도 좋을 것입니다!
std :: iterator_traits (#include)는 이미 포인터 용으로 전문화되어 있으므로 직접 제공하지 않아도됩니다. –
부스트를 위해 아무것도 추가 할 수 없다는 것은 무엇을 의미합니까? – GManNickG