2012-06-01 7 views
0

< <을 정의하고 싶습니다. STL 알고리즘과 같은 방식으로, 컨테이너의 첫 번째 요소와 마지막 요소를 인수로 사용하여 요소 시퀀스에서 작동합니다. . 단 하나의 인수를 취하는 것과는 대조적으로 컨테이너 자체 (예 :시퀀스의 ostream << 연산자를 오버로드하는 중

std::ostream& operator<< (std::ostream &out, std::list inList); 

난 단지 (I 등 목록, 벡터, 배열을 사용하고 내가 두 개의 인수, inList.begin으로 함수를 호출해야하는 경우에 관계없이 일하는 것이 하나 개의 함수를 작성해야하는 그래서) and inList.end()

문제는 연산자 < <은 단 하나의 인수 만 사용한다는 것입니다. 이것을 극복하는 가장 좋은 방법은 무엇입니까?

편집 : 답변 해 주셔서 감사합니다. 컨테이너의 하위 시퀀스 (STL 알고리즘과 같은)를 비롯하여 다양한 요소를 인쇄하는 기능을 선호하는 것이 더 분명했을 것입니다. 예 : 벡터 v 5 개 요소가있는 경우,이 같은 출력 v.begin에서 일련의() v.end하는()를주고 그들 모두를 인쇄 할 수 있으면 좋겠다 :

[element1 element2 element3 element4 element5] 

하지만 난이도를 인쇄 할 수 있으면 좋겠다 범위는 [v.begin(), v.begin() + 3)

[element1 element2 element3] 

당신의 제안 답변이 경우 작동겠습니까에서, 세 만 먼저?

답변

2

하나의 인수를 전달할 수는 없지만 어떤 종류의 컨테이너에서도 사용할 수있는 항목이 필요합니다. 그래서 이상적으로 당신은 단지처럼 구현할 수 있도록하지만,이 연산자가 미리 정의 된 것들과 충돌합니다

template <T> 
std::ostream& << (std::ostream& out, const T& sequence) { 
    return someFunction(out, sequence.begin(), sequence.end()); 
} 

처럼 뭔가을 찾고

template <typename T> 
std::ostream& someFunction(std::ostream& out, T first, T last) { 
    // do your stuff 
} 

ostream& operator<< 같은 기능을 할 것입니다. 다행히 당신은 몇 가지 템플릿 마법이 문제를 해결하려면 매우 좋은 솔루션을보고, this SO question을 확인하고 github project

참고 대응을 재생할 수 (아마도) 목적은 당신에게 컨테이너에 대한 일반적인 ostream& operator<<을 가지고하는 것입니다 때문에 함수 템플리트를 통해이를 달성 할 것이므로, 함수가 반복자를 사용하도록하는 것은 필수적이지 않습니다. 또한 컨테이너에 대한 참조를 취할 수도 있습니다.

1

하나의 인수 만 전달하고 메서드 내에서 beginend을 가져옵니다. 모든 표준 컨테이너는 beginend입니다. 그리고 아니오, 매개 변수의 수를 operator <<으로 변경할 수 없습니다.

+1

1) 함수 템플릿이 아니라 함수 템플릿을 작성해야합니다. 2) 아마도'std :: begin()','std :: end()'가 더 좋을까요? –

+0

@ Robᵩ 1) 아마 2) 왜 메이저 컴파일러에 대한 지원이 있는지 모르겠습니까? –

+0

2)'std :: begin()'은'std ::'컨테이너 외에도 배열을 전문화하기 때문에. –

1

이것은 오래된 질문이지만 최근에 같은 문제를 해결해야만하므로 여기에 해결책을 게시 할 것입니다. Range와 makeRange는 std :: pair와 std :: make_pair의 기능을 복제하지만 충돌을 피하기 위해 전자를 추가했습니다 (다른 유형의 쌍은 다르게 인쇄 될 수 있음).

#include <iostream> 

using namespace std; 

template <typename Iterator> 
struct Range 
{ 
    Range(); 
    Range(Iterator begin_, Iterator end_) : begin(begin_), end(end_) {} 

    Iterator begin, end; 
}; 

template <typename Iterator> 
Range<Iterator> 
makeRange(Iterator begin, Iterator end) 
{ 
    return Range<Iterator>(begin, end); 
} 

template <typename InputIterator> 
ostream & 
operator<<(ostream & out, Range<InputIterator> const & range) 
{ 
    for (InputIterator iter = range.begin; iter != range.end; ++iter) 
    { 
    if (iter != range.begin) out << ", "; // adjust formatting to taste 
    out << *iter; 
    } 

    return out; 
} 

int 
main(int argc, char * argv[]) 
{ 
    int a[] = { 1, 2, 3, 4, 5 }; 
    cout << makeRange(a, a + 2) << endl; // prints 1, 2 
} 
관련 문제