2013-04-23 4 views
2

BOOST의 ForEach와 사용자 정의 #define 매크로를 사용하여 컨테이너를 반복하는 것의 차이점은 무엇입니까 ??C++ BOOST ForEach 대 사용자 정의 매크로

내 :

#define iterate(i,x)  for(typeof(x.begin()) i=x.begin();i!=x.end();++i) 

boost: 
#include <string> 
#include <iostream> 
#include <boost/foreach.hpp> 

int main() 
{ 
    std::string hello("Hello, world!"); 

    BOOST_FOREACH(char ch, hello) 
    { 
     std::cout << ch; 
    } 

    return 0; 
} 

어떤 방법이 더 나은 이유를 설명하세요?

+4

Boost는 비표준 typeof 확장자가없는 컴파일러에서 실행되도록 코드를 구성했을 가능성이 큽니다. –

+1

한가지 차이점은'BOOST_FOREACH'는 일반 배열, 즉'char a [] = { "Hello, world!"};'에서 작동한다는 것입니다. –

+0

'typeof'에 의지해서는 안되며, 표준 C++가 아닙니다. 당신은'decltype'을 사용해야합니다 –

답변

2

먼저 큰 차이는,이 같은 우변을 사용하는 경우입니다 :

vector<int> foo(); 

// foo() is evaluated once 
BOOST_FOREACH(int i, foo()) 
{ 

} 

// this is evaluated twice(once for foo().begin() and another foo().end()) 
iterate(i, foo()) 
{ 

} 

BOOST_FOREACH가가를 rvalue되어 있는지 여부를 감지 (컴파일러에 의해 생략 할 수 있습니다) 사본을 생성하기 때문이다.

두 번째 차이점은 BOOST_FOREACHBoost.Range을 사용하여 반복기를 검색합니다. 이를 통해 쉽게 확장 할 수 있습니다. 배열과 std::pair에서 작동합니다.

세 번째 차이점은 iterate 매크로가 범위 유형을 자동으로 추론하여 typeof을 지원하지만 auto을 지원하지 않는 구형 컴파일러에서 매우 편리 할 수 ​​있다는 것입니다. 그러나 BOOST_FOREACH은 모든 C++ 03 컴파일러에서 작동합니다.

+0

'BOOST_FOREACH'는'auto'를 지원하는 컴파일러에서만 작동한다는 것을 암시하는 것처럼 보입니다. 그건 사실이 아니야. 'BOOST_FOREACH'는 C++ 11의 기능을 사용하지 않으며 실제로 고대의 컴파일러에서 작동합니다. 'BOOST_FOREACH'는 OP의'iterate' 매크로와 다른 점인 100 % C++ 03입니다. –

+0

@EricNiebler 죄송합니다. '자동'이 필요하다는 의미는 아니 었습니다. 더 명확하게하기 위해 수정했습니다. –