C++0X를 사용 못할 상황이 생겼다.
lambda 사용을 제거해야 하는데 매번 functor class를 만들어 주는 것도 만만치 않다.
bind를 잘 사용하면 될 것 같아서 해 봤는데,
lambda 사용 버전과 미사용 버전은 그 편의성과 직관성에서 비교가 되지 않는 것 같다.
그래도, 간단한 lambda에 대해서는 fuctor class를 만드는 것보다는 나을 것 같아서 정리해 본다.
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include <boost/bind.hpp> #include <boost/function.hpp> #include <iostream> #include <list> using namespace std; static int GLOBAL_COUNTER = 0; struct Foo { int m_Num; Foo() : m_Num( GLOBAL_COUNTER++ ) {} int GetNum() const { return m_Num; } }; struct FooBoo { Foo m_Foo; Foo& GetFoo() { return m_Foo; } }; FooBoo& Fun1( std::list< FooBoo >& l ) { int Number = 1; auto Itr = std::find_if( l.begin(), l.end(), [ Number ] ( FooBoo& fooboo ){ return fooboo.GetFoo().GetNum() == Number; }); return *Itr; } FooBoo& Fun2( std::list< FooBoo >& l ) { int Number = 1; std::list< FooBoo >::iterator Itr = std::find_if( l.begin(), l.end(), boost::bind( std::equal_to< int >(), Number, boost::bind( &Foo::GetNum, boost::bind( &FooBoo::GetFoo, _1 ) ) )); return *Itr; } int main( int argc, char * argv[] ) { std::list< FooBoo > l; l.push_back( FooBoo() ); l.push_back( FooBoo() ); l.push_back( FooBoo() ); FooBoo& Found1 = Fun1( l ); cout << Found1.GetFoo().GetNum() << endl; FooBoo& Found2 = Fun2( l ); cout << Found1.GetFoo().GetNum() << endl; return 0; } |
'Code Snippets > Boost' 카테고리의 다른 글
함수 호출 연기 & 함수 타입 캐스팅 (0) | 2010.09.17 |
---|---|
Nested Bind (0) | 2010.09.09 |
Generalized Function Pointers (0) | 2010.09.06 |
boost::bind 활용 (0) | 2010.09.03 |
boost 관련 유용한 링크 모음 (0) | 2010.08.20 |