2014-11-30 5 views
4

boost::async() (부스트 1.56, Windows : VS2010 및 VS2012)에서 예기치 않은 결과가 나타납니다. 어떤 이유로 boostFut를 들어 boost :: async()의 boost :: future <> 유형

#include <boost/thread/future.hpp> 
... 
auto func = [](){ return 123; }; 
auto boostFut = boost::async(func); 
// boostFut = 42; // intentional error to reveal deduced type in compilation error 

boost::unique_future<void> 대신 boost::unique_future<int>으로 추론된다.

내가 뭘 잘못하고 있니?

참고 : VS2012에, 내가 대신 기대와 미래 유형int으로 추론대로 작업을 수행 boost::async(func)std::async(func)를 사용합니다.

+0

'boost'의 버전이 유용합니다. 아, 때로는 함수가 전달 된 함수 객체에서'result_type' typedef를 원합니다. – Yakk

+0

위에서 설명한대로 : 부스트 1.56. 'result_type' 제안에 대해 자세히 설명해 주시겠습니까? 문제는 명시 적으로 다음을 정의하더라도 여전히 남아 있습니다 : boost :: unique_future boostFut = ...이 경우'asyn()'할당이 컴파일되지 않습니다. –

+0

죄송합니다. 부스트 함수 어댑터 중 일부는 전달 된 객체에서 결과 유형을 명시해야하거나 적어도 문제를 해결할 수없는 경우에는 그 이상으로 떨어질 것을 요구합니다. 문제가 함수 포인터로 없어지나요? 'struct foo {typedef int result_type; int operator()() const {return 42; };'? 'result_type'이없는'foo'? – Yakk

답변

4

boost::async은 인자 함수 호출의 결과 유형을 결정해야합니다. 그렇게하기 위해 Boost는 고유 한 boost::result_of<T> 클래스 템플릿 구현을 사용합니다. 즉, async 선언은 다음과 같습니다이다 :

template <class F> 
boost::future<typename boost::result_of<typename boost::decay<F>::type()>::type> 
async(F f); 

을 컴파일러의 기능/부스트의 구성에 따라 boost::result_of<T> 특성은 두 가지 방법 중 하나 일 수 있습니다

  1. 콜 표현에서 사용 decltype().
  2. F 내에 중첩 된 result_type typedef 또는 F 내에 중첩 된 result<T> 클래스 템플릿을 찾습니다 (과부하가 존재할 수 있기 때문에 functor의 인수 수가 0보다 큰 경우). 후자의 방법 (2)를 사용하는 경우

는, 상기 대안도 따라서 향상 반환 형식으로void을 추론 기본 가정 과 끝, 람다의 유형에 적용됩니다. boost/config/user.hpp 파일에 정의

#define BOOST_RESULT_OF_USE_DECLTYPE 

하거나 추가 :

부스트 구현 (미세 람다의 호출 식 작동) decltype() 연산자를 사용합니다 있는지 확인하려면, 당신은 부스트하기 전에 헤더 포함을 정의 씁니다 .

+0

좋은 답변입니다. 감사! –