2016-10-13 8 views
3

위한 기초 :액세스 포인터 I 이런 동적 배열 래퍼 템플릿이 루프

루프를 통한 값과 기준 액세스 제공
class Wrapper { 
    public: 
    T* const start; 
    T* const end; 
    T* begin() const { return start; } 
    T* end() const { return end; } 
    /* 
     more code 
    */ 
}; 

:

Wrapper<T> wrapper; 
for(auto val : wrapper) { 
    //do smth to value 
} 
for(auto& ref : wrapper) { 
    //do smth to reference 
} 

한다.

for(auto ptr = wrapper.start; ptr != wrapper.end; ptr++) { 
    //do smth to pointer 
} 

, 내가 포인터에 대한 액세스 권한을 부여 래퍼를 통해 범위를 기반으로 루프를 원하는 즉 : 지금이에 해당 루프를 기반으로 범위를 만들려고합니다. 내 래퍼 내부에 포인터에 대한 포인터 배열을 만들지 않고이 작업을 수행 할 수있는 방법이 있습니까?

편집 : 이미 here 지적 된 바와 같이 주석의

대니의 솔루션은 작동합니다. 실제로 다음 구문을 작성하는 방법이 있는지 궁금합니다.

for(auto ptr : wrapper) { 
    //do smth 
} 

이 위의 C 스타일 for 루프로 사용됩니다.

+0

참조 번호 – Dani

+0

에서 포인터를 가져올 수 있습니다. 'for (auto & ref : wrapper) {auto ptr = &ref;}'과 같은 의미입니까? 어쨌든'begin()'과'end()'메쏘드를 변경하여 암묵적으로 이것을 작동 시키도록 할 수 있습니까 : for (auto ptr : wrapper) {/ * do smth * /}'? –

답변

1

당신은

class iterator { 
    T* ptr; 
public: 
    explicit iterator(T* ptr) : ptr(ptr) {} 
    iterator& operator++() {ptr++; return *this;} 
    bool operator!=(iterator other) const {return ptr != other.ptr;} 
    T* operator*() const {return ptr;} 
}; 

를 역 참조 다음 beginend 기능에서이 반복자를 반환 할 때 T*을 반환 사용자 정의 반복자를 작성할 수 있습니다.

비록 배열 래퍼에 대한 약간의 놀라운 동작이라고 생각합니다.

Live demo.

+0

정말 멋져. 감사. 배열 래퍼는 단지 최소한의 예일뿐입니다. –