2009-05-01 3 views
4

부스트 라이브러리 (http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458)의 program_options에서 예제를 이해하려고합니다.이 프로그래밍 기술은 무엇입니까? (부스트 라이브러리)

특히이 부분은 다음과 같습니다.

desc.add_options() 
    ("help", "produce help message") 
    ("compression", po::value<int>(), "set compression level") 
; 

여기서 정확히 무엇을하고 있으며 어떤 기술입니까?

이 부분의 desc.add_options()는 함수 호출 일 수 있지만 other()는 어떻게 여기에 적합합니까? 어떤 종류의 연산자 오버로딩인가요?

고마워!

답변

14

"add_options()"함수는 실제로 functor을 반환합니다. 즉,() 연산자를 재정의하는 객체입니다. 이 함수 호출 다음

desc.add_options() ("help", "produce help message"); 

실제로

desc.add_options().operator()("help", "produce help message"); 

에 "연산자를()"당신이 보여준대로 호출이 체인 될 수 있도록 또한, 펑터를 반환 확장을 의미한다.

11

는 아마도 add_options는()

과부하 (...)를 사용하면 클래스를 만들 수 있습니다 (BTW, 매우 유용한 기술입니다) "체인"을 지원하기 위해 오버로드 연산자()가 펑의 일종을 반환 그 기능처럼 작동합니다. 예를 들어

: 당신이 연산자를 만들 경우

struct func 
{ 
    int operator()(int x) 
    { 
     cout << x*x << endl; 
    } 
}; 

... 

func a; 
a(5); //should print 25 

그러나(), 객체에 다음 수 "체인"연산자를 참조를 반환합니다.

struct func { func& operator()(int x) { cout << x*x << endl; return *this; } }; ... func a; a(5)(7)(8); //should print 25 49 64 on separate lines 

A는 (5)를 반환한다

(A (5)) (7) 이상 또는 이하 동일 a(5); a(7);이다.

+0

좋은 답변입니다. 당신과/또는 누군가가 왜 체인이 "매우 유용"하는지에 대해 확장 할 수 있다면, 이것이 완전한 것입니다 ... – mikeh

관련 문제