boost::function과boost::bind 함수 사용에 대한 소감

5142 단어 function
최근에 스레드 탱크를 쓰기 시작했는데, 그 동안 통용되는 함수 템플릿으로 각 스레드가 다른 작업을 수행할 수 있도록 하려고 Boost 라이브러리의function 함수를 찾았습니다.
Boost:::function은 함수 패키지이자 함수 템플릿으로 같은 반환 유형, 같은 매개 변수 유형, 그리고 같은 매개 변수 개수의 서로 다른 함수를 대체할 수 있습니다.
 1 #include<boost/function.hpp>

 2 #include<iostream>

 3 typedef boost::function<int(int ,char)> Func;  4 

 5 int test(int num,char sign)  6 {  7    std::cout<<num<<sign<<std::endl  8 }  9 

10 int main() 11 { 12  Func f; 13   f=&test;  //or f=test

14  f(1,'A'); 15 }

이렇게 하면 서로 다른 곳에서 서로 다른 함수로 f를 대체하면 C++와 유사한 다태적 효과를 얻을 수 있다.
그러나 이렇게 하면 일정한 한계가 있다. 예를 들어 내가 실현하고자 하는 스레드 탱크는 서로 다른 임무를 수행해야 한다. 이런 임무의 반환 유형, 함수 매개 변수 개수, 매개 변수 유형은 틀림없이 다르기 때문에 위의 방법으로 실현할 수 없다. 그러면 어떻게 함수 템플릿을 정의하여 각종 반환 유형, 함수 매개 변수 개수, 매개 변수 유형이 다른 각종 함수를 포함할 수 있겠는가?
우리는 다음과 같은 유형을 정의할 수 있다
1 typedef boost::function<void()> Func; 2 //or 3 typedef boost::function<void(void)> Func;

void 유형(공 유형)은 사실 C의 네 가지 데이터 유형 중 하나이고 나머지 세 가지는 기본 유형, 구조 유형, 지침형이다.
빈 형식은 주로 반환 형식과 함수 파라미터를 수식하는 데 사용되며, 정의 변수를 사용할 수 없습니다.voidi는 오류입니다.
빈 형식은 추상적인 기류로 정의된 변수를 사용할 수 없지만 모든 유형을 표시할 수 있다. 이렇게 이해하기 어렵지 않다.void*바늘은 강제로 다른 유형의 바늘로 바꾸지 않아도 된다.
void 형식의 반환 형식은 우리가 여러 가지 다른 유형을 반환할 수 있음을 나타냅니다. 그러면 우리는 어떻게 매개 변수를 전송합니까?boost::bind를 사용할 수 있습니다.
 1 #include<boost/function.hpp>

 2 #include<boost/bind.hpp>

 3 #include<iostream>

 4 typdef boost::function<void(void)> Func;  5 

 6 int test(int num)  7 {  8    std::cout<<"In test"<<std::endl;  9 } 10 

11 int main() 12 { 13   Func f(boost::bind<test,6>); 14  f(); 15 }

bind를 사용하여 각 매개 변수를 전송하여 통용되는 함수 템플릿을 형성합니다.
그러나 f () 의 반환 값은void 형식이기 때문에 다음과 같이 쓸 수 없습니다.
1 int result=f(); 2 //or 3 std::cout<<f()<<std<<endl;

그러나 상관없다. 우리는 매개 변수에서 결과를 전달할 수 있다.
 
 

좋은 웹페이지 즐겨찾기