std::result_of
C ++ 0x 의 필요성을 이해하는 데 약간의 어려움이 있습니다. 내가 올바르게 이해 result_of
했다면는 특정 유형의 매개 변수로 함수 객체를 호출하는 결과 유형을 얻는 데 사용됩니다. 예를 들면 :
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
다음 코드의 차이점은 실제로 보이지 않습니다.
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
또는
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
이 두 가지 솔루션에서 확인할 수있는 유일한 문제는 다음 중 하나가 필요하다는 것입니다.
- decltype에 전달 된 표현식에서 사용할 functor의 인스턴스가 있습니다.
- 펑터에 대해 정의 된 생성자를 알고 있습니다.
나는 사이의 유일한 차이는 그 권리의 생각에서 오전 decltype
과는 result_of
두번째하지 않는 반면 첫 번째는 식을 필요로한다는 것이다?
decltype
하는 한은 더 못 생겼지 만 더 강력합니다.result_of
호출 가능한 유형에만 사용할 수 있으며 인수로 유형이 필요합니다. 예를 들어,result_of
여기 에서는 사용할 수 없습니다template <typename T, typename U> auto sum( T t, U u ) -> decltype( t + u );
. 인수가 산술 유형일 수있는 경우 ( 를 나타내도록F
정의 할 수있는 함수가 없습니다 . 사용자 정의 유형의 경우 할 수 있습니다. 같은 방식으로 (실제로 해본 적이 없음) 상상합니다. 회원 메소드 호출과는 어려울 수도 바인더 또는 람다 사용하지 않고F(T,U)
t+u
result_of