2011-09-16 7 views
0

이 작업을 수행하는 방법이 있습니까 (MS VS 2008)? l- 값 객체로 boost :: bind

boost::bind mybinder = boost::bind(/*something is binded here*/); 
mybinder(/*parameters here*/); // <--- first call 
mybinder(/*another parameters here*/); // <--- one more call 

나는
int foo(int){return 0;} 

boost::bind<int(*)(int)> a = boost::bind(f, _1); 

을 시도했지만 작동하지 않습니다.

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? –

+9

몇 가지 이전 답변을 수락하십시오. 당신은 1 년 넘게 여기에 있었는데, 그것은 SO가 어떻게 작동 하는지를 배울 수있는 충분한 시간입니다. –

답변

2

바인드는 지정되지 않은 유형을 반환하므로 유형의 변수를 직접 만들 수 없습니다. 그러나 모든 함수 또는 펑터 유형을 구성 할 수있는 유형 템플릿 boost::function이 있습니다. 따라서 :

boost::function<int(int)> a = boost::bind(f, _1); 

트릭을해야합니다. 게다가 어떤 값을 바인딩하지 않는다면, function은 함수 포인터로부터도 구성 가능하기 때문에, bind 없이는 플레이스 홀더 만 할 수 있습니다. 그래서 :

boost::function<int(int)> a = &f; 

는 한 fint f(int) 같이 작동합니다. 즉 C++ 11으로의 전화에 직접 들어

std::function<int(int)> a = [](int i)->int { return f(i, 42); } 

주 : 유형은 C++ 11 클로저 (및 bind도 인정되었다)와 함께 사용될 std::function로 C++ 11로 만들었다

auto a = [](int i)->int { return f(i, 42); } 

하지만 당신은 그것을 주변에 전달하려면, std::function은 여전히 ​​유용 : auto의 새로운 사용이 용이하다.

+0

C++ 11과 람다를 사용한다면'std :: function'을 사용해야합니다. –

+0

@Tomalak : C++ 11 부분을 확장하고 거기에서'std ::'로 전환했습니다. –

+0

Mucho bettero! :디 –

3
int foo(int){return 0;} 
boost::function<int(int)> a = boost::bind(f, _1); 
+0

그 중 하나가 맞지 않습니다. 'a'는 함수 포인터로서'foo'와 직접적으로 동일해야합니다 - 여기서 바인딩 할 필요는 없습니다. – Puppy

+0

"C2079 오류 :"a '는 정의되지 않은 클래스'boost :: function '을 사용합니다. " – fogbit

+0

@fogbit : 그러면 # boost.function을 포함하지 않았습니다. –