2012-04-11 3 views
2

약간 고밀도이지만 아래 라인이 이해할 수없는 부분이 있습니까? 내가 객체 호출 (my_thread 이름) 스레드 생성을 실현C++에서 연산자 오버로드를 이해하십시오.

class background_task 
{ 
    public: 
    void operator()() const 
    { 
     do_something(); 
     do_something_else(); 
    } 
}; 

background_task f; 
std::thread my_thread(f); 
  1. 클래스 background_taskf하지만 때 클래스 background_task의 기능 operator() 사실이라고?

  2. 왜 함수 연산자의 오버로드가 필요합니까?

  3. 나는 이것이 C++ 101이거나 매우 기본적인 것임을 이해하지만 여전히 이해할 수는 없으므로 C++과 같은 주제에 대해 더 자세히 알아 보려면 어떤 책을 참조해야합니까?

+1

이것은 [연산자 오버로딩] (http://stackoverflow.com/q/4421706/1025391)에 관한 것이 아니라 C++ 펑터에 관한 것입니다. 귀하의 질문에 대한 자세한 답변은이 게시물 (http://stackoverflow.com/a/356993/1025391)을 참조하십시오. – moooeeeep

+1

걱정하지 마십시오. 이것은 C++ 101이 아닙니다. 입문용 C++ 클래스는 확실히 쓰레드를 다루지 않을 것이고, 아마도 커스텀 함수 호출 연산자를 다루지 않을 것이고, 심지어 자신의 클래스를 작성하는 것을 다루지 않을 수도 있습니다. –

답변

2

operator()()

class background_task 
{ 
public: 
void operator()() const 
{ 
    do_something(); 
    do_something_else(); 
} 
}; 

의이 정의는 당신이 background_task를 인스턴스화하고 (이 경우 인수없이)를 호출 할 수 있다는 것을 의미한다. 그래서 그것을 background_task의 인스턴스를 괜찮 전달

background_task f; 
f(); // calls foo::operator()(), i.e calls do_something() and do_something_else(). 

스레드에 관해서는,이 매개 변수를 사용하지 않는 호출 가능한 개체를 필요로 : 그게는 "호출 엔티티"수 있습니다. background_task가 호출되지 않은 경우 다음은 컴파일되지 것입니다 :

background_task f; 
std::thread my_thread(f); 

std::thread 생성자는 또한 매개 변수가있는 경우는 호출 기업의 인수를 전달할 수 것이므로 계속 예를 들어

class background_task 
{ 
public: 
void operator()(double x) const 
{ 
    // do something with x, if you want 
    do_something(); 
    do_something_else(); 
} 
}; 

는 것

background_task f; 
std::thread my_thread(f, 3.1416); 

내부적으로 스레드는 f (3.1416)를 호출하는 것과 동일합니다.

편집 : 원본으로 나는 과부하가 없다고 주장했습니다. 그게 완전히 명확하지 않아서 나는 대답을 바꾸었다.

+0

글쎄, 기술적으로 잘못되었지만, 커스텀 연산자 구현을 "연산자 오버로딩"이라고 지칭하는 것이 일반적인 관행 인 것 같습니다. 슬프게도, 말은 항상 의미가있는 것은 아닙니다. – bitmask

+0

@bitmask 이제 내 생각이 생겼어. 아마도 특정 유형에 대해 이미 정의 된 무언가가 오버로드 된 것과 달리 연산자 void (void)가 오버로드 된 것으로 간주하는 경우 결국 오버로드가됩니다 ... – juanchopanza

+0

첫 번째 암시 적 매개 변수 ('this')는 항상 호출 할 함수를 결정합니다. 나는'void X :: foo()'와'void Y :: foo()'는 이름이 같고 (논리적 인) 인수 만이 다르더라도'foo'의 오버로드라고 말하지 않을 것이다. 동일한 추론이'void operator()() const'에도 적용됩니다. 하지만 난 nitpicking :) – bitmask

1
  1. 스레드 객체 std::thread(f, a, b, c)는 개체 f의 복사본 (의이 copy_of_f를 부르 자)하게하고, 새로운 실행 컨텍스트의 엔트리 포인트는 통화 copy_of_f(a, b, c) (또는 그 이상 자세하게, copy_of_f.operator()(a, b, c))입니다.

  2. 오브젝트 f 표현식 f(a, b, c)이 이해되어야한다는 의미 호출 엔티티이어야.

  3. 특히 C++ 11 관련 서적은 아직 작성 중입니다. 올해 말 Stroustrup, Meyers 및 다른 사람들을 찾으십시오. 그때까지는 인터넷이 아마도 최선의 방법 일 것입니다.

관련 문제