2016-06-29 2 views
-1

:reference_wrapper의 구현 세부 사항

template< class... ArgTypes > 
    typename std::result_of<T&(ArgTypes&&...)>::type 
    operator() (ArgTypes&&... args) const { 
    return std::invoke(get(), std::forward<ArgTypes>(args)...); 
    } 

왜 우리는 어쨌든 연산자()를 필요합니까? 어떻게 작동합니까?

반환 콘텐츠 "result_of :: type"은 무엇입니까?

무엇 (ArgTypes & & ..) ??

invoke (get) ???

이 코드는 다른 행성 :

private: 
    T* _ptr; 
}; 

답변

1

우리가 왜 필요합니까 연산자() 어쨌든에서 C++처럼 보인다? 어떻게 작동합니까?

문맥

int foo(int bar) 
{ 
    return bar + 5; 
} 

int main() 
{ 
    std::reference_wrapper<int(int)> ref = foo; 
    ref(5); 
} 

ref(5) 통화 참조 래퍼의 operator() 다음과 같은 가정하자. 이 경우에는 사용자 정의 변환이 발생하지 않기 때문에 작동하지 않을 것입니다.

operator()은 저장된 함수의 반환 값이고 std::invoke은 그러한 함수를 호출하고 매개 변수를 전달합니다.

+0

와우, 그래서 reference_wrapper는 함수를 캡슐화 할 수있을뿐만 아니라 템플릿 매직은 템플릿 매개 변수 전달을 사용하여 함수 호출을 표현할 수 있습니까? 그 놀라운! 어떻게 알았어? std :: result_of, std :: invoke 등에 대해 배울 수 있습니다. 나는. 나는 아마도 함수를 감싸는 것이 허용되는지, 또는이 사용자 정의 템플릿을 사용하여 반환 유형을 표현할 수 있는지 추측 할 수 있습니다. 큰 체계적인 매뉴얼이 있습니까? 아니면 그 "신성한 지식"? – barney

+0

@barney ['std :: result_of'] (http://en.cppreference.com/w/cpp/types/result_of), ['std :: invoke'] (http://en.cppreference.com/ cpp/유틸리티/기능/호출). 이 사이트에는 표준 클래스에 대한 설명이있을뿐만 아니라 구현 가능한 섹션 *이 있습니다. 구현 섹션에서 구현 방법을 볼 수 있으며 그로부터 많은 것을 배울 수 있습니다. – Zereges