STL의 함수-객체에 관한 질문입니다.
글쓴이: coco / 작성시간: 수, 2003/08/20 - 11:15오전
안녕하세요? 모두 평안하지죠?
요즘에 니콜라이 M.조슈티스가 쓴 C++ Standard Library 튜토리얼.레퍼런스 책을 공부를 하다가 chapter8의 함수-객체의 한 부분에서 막혀서 여러분에게 도움을 구하고자 이렇게 적습니다.
아래의 코드는 함수-객체를 레퍼런스 타입으로 전달하기 위해 사용자가 함수-객체의 타입이 레퍼런스가 되도록 알고리즘의 호출 부분을 적절하게 수정 시켜서 수행하는 예제 입니다.
#include <iostream> #include <list> #include <algorithm> #include "print.hpp" using namespace std; class IntSequence { private: int value; public: // constructor IntSequence (int initialValue) : value(initialValue) { } // ``function call'' int operator() () { return value++; } }; int main() { list<int> coll; IntSequence seq(1); // integral sequence starting with 1 // insert values from 1 to 4 // - pass function object by reference // so that it will continue with 5 =============================================== generate_n<back_insert_iterator<list<int> >, int, IntSequence&>(back_inserter(coll), // start 4, // number of elements seq); // generates values -- 이 부분의 해석을 못하겠어요 =============================================== PRINT_ELEMENTS(coll); // insert values from 42 to 45 generate_n (back_inserter(coll), // start 4, // number of elements IntSequence(42)); // generates values PRINT_ELEMENTS(coll); // continue with first sequence // - pass function object by value // so that it will continue with 5 again generate_n (back_inserter(coll), // start 4, // number of elements seq); // generates values PRINT_ELEMENTS(coll); // continue with first sequence again generate_n (back_inserter(coll), // start 4, // number of elements seq); // generates values PRINT_ELEMENTS(coll); }
위의 코드에서 제가 표시한 곳을 자세히 좀 설명좀 해주세요.
generate_n()함수는 어떡해 사용하는지는 알겠는데, 제가 표시해 놓은 부분은 어찌 해석야 하는지 모르겠군요.
부탁드리겠습니다.
긴글 읽어 주셔서 감사합니다.[/code]
Forums:
Re: STL의 함수-객체에 관한 질문입니다.
함수객체를 참조로 전달할 때는,
미리 생성된 함수객체의 이름(seq)을 인자로 넘기면 됩니다.
그러면 함수객체의 상태가 알고리듬(generate_n) 호출 이후에도 그대로 남아있게 되죠. (즉 seq.value == 45)
반면에 일반적인 사용법인, 값으로 함수 객체를 넘기는 경우는 상태가 저장되지 않습니다. 그러므로 미리 함수객체를 생성하지 않고, 알고리듬 호출시에 생성자를 호출하여 만들어진 임시 함수객체를 복사하여 인자로 넘기는 것이 편리합니다. 알고리듬 호출 후에는 임시 함수객체는 런타임 스택에서 pop되어 사라지게 되죠.
댓글 달기