2017-12-18 22 views
3
cppreference

, std::result_of을 사용하는 올바른 방법이라고 기록됩니다올바른 방법으로 invoke_result를 사용 하시겠습니까?

template<class F, class... Args> 
std::result_of_t<F&&(Args&&...)> 
// instead of std::result_of_t<F(Args...)>, which is wrong 
    my_invoke(F&& f, Args&&... args) { 
    /* implementation */ 
} 

나는 std::invoke_result_t 사용해야 궁금 해서요 : invoke_result_t :

template<class F, class... Args> 
std::invoke_result_t<F&&, Args&&...> my_invoke(F&& f, Args&&... args); 

또는 :

template<class F, class... Args> 
std::invoke_result_t<F, Args...> my_invoke(F&& f, Args&&... args); 

답변

4

invoke_result은,:

평가되지 않은 피연산자로 처리 할 때 발현 INVOKE(declval<Fn>(), declval<ArgTypes>()...)이 잘 형성된 경우

는 달리 type 이름 유형 decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...)); 타입 정의 부재는 어떠한 부재 type 없어야한다.

template<class T> add_rvalue_reference_t<T> declval() noexcept; 

그래서 std::invoke_result_t<F&&, Args&&...>std::invoke_result_t<F, Args...> 사이에는 차이가 없습니다 :로

declval 지정됩니다. 글자는 4 문자 더 짧지 만 정확히 동일한 것을 의미합니다 (F도 아니고 Args...void 일 수 없음).

+1

템플릿 인수를 다른 곳에서 가져오고 참조 할 수없는 경우가있을 수 있습니다.이 경우 '&&'버전은 일반 버전이 아니라면 오류가 발생할 수 있습니다. 그러나 꽤 멀리 가져 왔습니다. –