2013-02-11 1 views
2

Visual Studio 2010을 사용하고 있습니다. VS2010에서 제외되었지만 VS2012에 포함 된 기능 중 하나는 범위 기반의 for-loop입니다.VS2010에서 범위 기반 루프/for_each에서 포인터를 얻는 방법은 무엇입니까?

VS2012에서는 당신이-루프와 같은 깔끔한 슈퍼 깔끔한 수행 할 수 있습니다 몇 가지를 읽고시

for(auto it = myElements.begin(), end = myElements.end(); it != end; it++) 
    it->something(); 

: 지금까지

for(auto& it: myElements) 
    it->something(); 

, 내가 VS2010에서 얻을 수있는 가장 가까운이 구문입니다 boost/foreach를 사용하여 다음 매크로에 액세스 할 수 있음을 발견했습니다.

BOOST_FOREACH(auto it, myElements){ 
    it.something(); 
} 

내 문제는 wi 이 방법은 복사본 (또는 이와 비슷한)을 제공하고 포인터이 아니어야합니다. 여기 내가 혼란스러워하는 곳입니다.

그것은 더 동적 할당을하지 않습니다

, 아니 가상 함수 호출하거나 함수 포인터를 통해 통화 및 컴파일러의 최적화에 투명하지 않은 어떤 전화도하지 않습니다하게 다음 foreach reference는 다음과 말했다.

이게 무슨 의미입니까? 사본이 아닌가?

어떻게하면 BOOST_FOREACH에서 포인터를 다시 얻을 수 있습니까? 아니면 다른 부스트 기능을 사용해야합니까?

나는 여기에 다른 질문이 구문을 본 적이 :

BOOST_FOREACH(auto& it, myElements){ 
    it->something(); 
} 

그러나이 나를 위해 컴파일하고 편집기에서 오류가 발생하지 않습니다. 이게 뭐가 잘못 됐어? 왜 나는 다른 많은 질문에 대한 유효한 코드로 여기를 찾았습니까?

VS2010에 범위 기반의 for-loop를위한 멋지고 깔끔한 솔루션이 있습니까? (를 포함하여 부스트)

+0

관련이 없지만 범위 루프의 경우 참조를 참조 할 필요가 없습니다. – Rapptz

+0

'it.setSomething (0)'방식으로 아무것도 수정하려고하면 사라집니다. – zsero

+0

바르게 수정하면 일부 반복자가 무효화됩니다. – Rapptz

답변

2

주요 질문은 포인터 컨테이너가 있습니까? VS2012에서도 for(auto& it: myElements) it->something();은 (스마트) 포인터 컨테이너에서만 작동합니다. &it이 참조이며 ->은 포인터임을 알려줍니다. 그것은 모순이 아닙니다. 포인터에 대한 참조를 가질 수 있습니다.

하지만 어쨌든 포인터를 원하십니까? 참고 문헌은 훨씬 더 관용적입니다.

+0

이것에 감사드립니다. 스마트 포인터를 광범위하게 사용하는 프로젝트를 보았 기 때문에이 라인을 작성하는 것이 표준 (혼란 스럽습니다)이었습니다. 혼란의 또 다른 부분은 [boost 참조 페이지] (http://www.boost.org/doc/libs/1_53_0/doc/html/foreach.html)에있는 거의 모든 예제는'std ::리스트 list_int (/*...*/); BOOST_FOREACH (int i, list_int) { // do something with i } 그리고 여기서 // 나는 무엇인가를하는 것은 매우 혼란 스럽습니다. FOR_EACH에서 참조를 사용하지 않을 때 원본 객체의 사본이 아닌가? – zsero

1

이것은 잘못된 것입니다 :

for(auto& it: myElements) 
    it->something(); 

이 범위 기반 루프에 대한 참조를 반환

VS2012에서는 당신이 좋아하는 깔끔한 슈퍼 단정를위한 루프를 할 수 객체에 :

for(auto& element: myElements) 
    element.something(); 

편집

첫 번째 구문은 컨테이너에 저장된 객체가 포인터이거나 스마트 포인터와 같은 operator*을 오버로드 한 클래스의 객체 인 경우 유효합니다.

+0

고마워요, 두 번째 코드 부분은 제가이 문제를 해결하는 데 도움이되었지만 첫 번째 경우는 스마트 포인터를 사용할 때 유효 할 수 있습니다. – zsero

관련 문제