2011-05-11 2 views

답변

5

:

using namespace boost::lambda; 
using boost::thread; 

int add(int a, int b) {return a+b;} 

int sum, x=2, y=6; 
thread adder(var(sum) = add(_1, _2), x, y); 
adder.join(); 
cout << sum; 

나는 컴파일 오류가 발생합니다! 문제는 Lambda의 자리 표시자를 사용하여 add()를 직접 호출한다는 것입니다. Lambda 내부에서 느리게 평가되지는 않지만 곧바로 평가됩니다. 여기

는 고정 된 버전입니다 :

using namespace boost::lambda; 
using boost::thread; 

int sum, x=2, y=6; 
thread adder(var(sum) = _1 + _2, x, y); 
adder.join(); 
cout << sum; 

그리고 당신이 정말로 add 기능을 사용하려면, 당신은 bind을 사용하십시오 :

using namespace boost::lambda; 
using boost::thread; 

int add(int a, int b) {return a+b;} 

int sum, x=2, y=6; 
thread adder(var(sum) = bind(add, _1, _2), x, y); 
adder.join(); 
cout << sum; 
+1

그리고 함수 호출, 사용'의 호출을 지연 바인딩. – GManNickG

+0

필자는 확실히이 함수를 사용할 필요가 있습니다. 'add'예제는 총체적 단순화입니다. :) 그러나 스레드에 대한 구문을 시도 :'스레드 합계 (var (sum) = bind (add, _1, _2), x, y); ' MSVC 9 (boost 1.43)에서 오류가 발생합니다. '내부 (INT, INT)을': '부스트/λ/세부/function_adaptors.hpp (260) : 오류 C2664 맞게 트림 [ 결과'내부 '에'RT2 ' 에서 파라미터 2를 변환 할 수있다 = INT, Func을 = INT (INT, INT) RET = INT, A2 = RT1, A3 = RT2, 이며 Arg1 = INT, ARG2 = INT, A1 = RT1, I = 2 ]' –

+0

Nevermind. 나는'boost :: lambda :: _ 1;'등을 사용하는 것을 잊어 버렸습니다. 왜 나는 더 많은 오류를 드러내지 않는지 궁금합니다. 나는 어느 범위에서 _1/_2 인지도 모르겠다! 나는 boost 또는 std를 위해 네임 스페이스를 사용하지 않는다. –

관련 문제