function

그런데 범용 바인더 bind 에 의해서 생성된 함수 오브젝트를 변수로 저장하여 얼마든지 알고리즘으로 사용해서 돌리는 것을 생각해 봅시다. 그러기 위해서는 bind가 생성한 함수 오브젝트의 ''을 가지는 변수를 선언하지 않으면 안됩니다.

   

 

bind의 생성하는 함수 오브젝트의 ''

cout << typeid (tr1::bind(&Sandwich::make, _1, _2, _3)).name();

 

실행 결과

class boost::_bi::bind_t< class std::basic_string< char ,

struct std::char_traits< char >,class std::allocator< char > >,

class boost::_mfi::cmf2< class std::basic_string< char ,

struct std::char_traits< char >,class std::allocator< char > >,

class Sandwich,class std::basic_string< char ,

struct std::char_traits< char >,class std::allocator< char > > const &,

class std::basic_string< char ,struct std::char_traits< char >,

class std::allocator< char > > const &>,

class boost::_bi::list3< class boost::arg<1>,class boost::arg<2>,class boost::arg<3> > >

 

……터무니없고 복잡한 형태가 만들어져 있습니다. 이것으로는 변수를 선언할 수 없습니다. 클래스 템플릿 function 은 함수 오브젝트의 범용적인''으로서 기능합니다.

 

 

함수 오브젝트를 통일적으로 취급한다

#include <iostream>

#include <algorithm>

#include <functional>

#include <boost/tr1/functional.hpp>

 

using namespace std;

 

// x < y 이라면 true를 돌려준다

bool less_int( int x, int y) {

return x < y;

}

 

// 승순/내림차순 어느 쪽에도 사용할 수 있는 비교 함수

template <typename T>

bool compare(T x, T y, bool descend) {

return descend ? (x < y) : (y < x);

}

 

int main()

{

const int N = 8;

int data[N] = { 0, -1, 1, -2, 2, -3, 3, 4 };

// template 인수가 조금 특수.

// 반환값 (변수,변수...) 라고 하는 형식.

tr1::function< bool ( int ,int)> comp;

// 승순으로 소트

using namespace tr1::placeholders;

comp = tr1::bind(&compare< int >, _1, _2, true );

sort(data, data+N, comp);

for ( int i = 0; i < N; ++i ) cout << data[i] << ' '; cout << endl;

// 같은 승순으로 소트

comp = &less_int;

sort(data, data+N, comp);

for ( int i = 0; i < N; ++i ) cout << data[i] << ' '; cout << endl;

// 이것도 역시 내림차순으로 소트

comp = less< int >();

sort(data, data+N, comp);

for ( int i = 0; i < N; ++i ) cout << data[i] << ' '; cout << endl;

}

 

 

 

출처 : http://codezine.jp/a/article/aid/2158.aspx

 

저작자 표시
신고
by 흥배 2010.03.07 08:30
| 1 |