http://cafe.naver.com/ecpp/176
#include <iostream>
#include "boost/bind.hpp"
void func(int a, int b, int c)
{
std::cout << a << " " << b << " " << c << std::endl;
}
void main()
{
boost::bind( &func, _3, _2, _1 )( 1, 2, 3 );
}
http://cafe.naver.com/ecpp/177
#include <iostream>
#include <string>
#include "boost/bind.hpp"
void printFunc(std::string s
{
std::cout << s << std::endl;
}
class printClass
{
public:
void print(std::string s)
{
std::cout << s << std::endl;
}
};
void main()
{
(boost::bind(&printFunc, _1))( " func " );
(boost::bind(&printClass::print, printClass(), _1))( " member func " );
}
http://codevania.tistory.com/16
코드의 미묘한 중복을 줄이는데 템플릿만한 것이 없다고 생각한다.
보통 아래와 같은 패턴을 가진 함수들... 즉 Value와 Data의 타입이 다르지만 뭔가 동일한 루틴을 가진 함수들...
이런 함수들이 여러개 있다면, 주저 없이 boost::bind를 사용해서 중복을 줄여보자.
( STL의 bind도 가능하지만, mem_fun에서 받을 수 있는 인자는 1개 뿐인 반면 boost는 8개다 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | bool Func( ValueType Value, DataType Data ) { // 뭔가를 검사하는 작업 if ( 0 < Data.a ) { ASSERT( "Someting bad is gonna happen. -_- [%d]" , Data.a ); return false ; } // 여러 함수에 걸쳐... 약간씩 다른 함수 호출 Value = Creator(); // 여러 함수에 걸쳐... 동일한 루틴들 ++m_iMyCount; DoSomething(); return true ; } |
Code Snippet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | int main() { DataType1 D1; DataType2 D2; int Sum = 0; bool bSuccess = false ; bSuccess = Func( Sum, D1, boost::bind( boost::mem_fn( &MyManager::Sum2 ), &g_Manager, D1.a, D1.b ) ); ShowResult( bSuccess, Sum, "Sum2가 template이 아니라면 간단히 호출 가능" ); bSuccess = Func( Sum, D1, boost::bind( boost::mem_fn< int , MyManager, int , short >( &MyManager::Sum2 ), boost::ref( g_Manager ), D1.a, D1.b ) ); ShowResult( bSuccess, Sum, "Sum2가 template이라면 mem_fn을 명시적으로 호출" ); boost::function< int ( int , short ) > mfSum2 = boost::bind( &MyManager::Sum2, &g_Manager, _1, _2 ); bSuccess = Func( Sum, D1, boost::bind( mfSum2, D1.a, D1.b ) ); ShowResult( bSuccess, Sum, "mem_fn을 바인드 시켜서, 나중에 인자와 함께 호출" ); boost::function< int () > FtrFunc = boost::bind( boost::mem_fn< int , MyManager, int , short >( &MyManager::Sum2 ), &g_Manager, D1.a, D1.b ); bSuccess = Func( Sum, D1, FtrFunc ); ShowResult( bSuccess, Sum, "함수 자체를 funtion에 바인드도 가능" ); boost::function< int () > FtrFunc2 = boost::bind( boost::mem_fn< int , MyManager, int , short , long >( &MyManager::Sum3 ), &g_Manager, D2.a, D2.b, D2.c ); bSuccess = Func( Sum, D1, FtrFunc2 ); ShowResult( bSuccess, Sum, "인자3개짜리가 필요할 때도 간편하게 사용" ); } |
결과
(Result: 1 (Sum: 3 | Sum2가 template이 아니라면 간단히 호출 가능
(Result: 1 (Sum: 3 | Sum2가 template이라면 mem_fn을 명시적으로 호출
(Result: 1 (Sum: 3 | mem_fn을 바인드 시켜서, 나중에 인자와 함께 호출
(Result: 1 (Sum: 3 | 함수 자체를 funtion에 바인드도 가능
(Result: 1 (Sum: 6 | 인자3개짜리가 필요할 때도 간편하게 사용
'메타프로그래밍 > Boost::' 카테고리의 다른 글
boost::unordered_set (0) | 2012.11.13 |
---|---|
Boost::[bind, mem_fn ] 과 STL , 멤버함수 조합사용 (0) | 2012.11.13 |
boost::mem_fn (0) | 2012.11.13 |
boost::unordered_map (0) | 2012.11.13 |
boost::filesystem (파일, 디렉터리 다루기) (0) | 2012.11.04 |