Pages

2008年10月5日 星期日

如何讓束縛函式作用在自訂的函式物件中

束縛函式可以對雙元的函式物件作限制,共分為兩種:bind1st bind2nd。例如:
less<T>(a, b);      // 比較 a 是否比 b 小
bind1st(less<T>(), 50); // 限制 a 為 50,比較 50 < b
bind2nd(less<T>(), 90);  // 限制 b 為 90,比較 a < b ##ReadMore##  
如果我想讓束縛函式限制我自訂的函式物件,該如何做?這時只要去繼承 binary_function 這個結構即可,我們可以稍微看一下他的長相:include/bits/stl_function.h
template <class _Arg1, class _Arg2, class _Result> 
struct binary_function
{
 typedef _Arg1 first_argument_type;
 typedef _Arg2 second_argument_type;
 typedef _Result result_type;
};
它是由三個樣板參數組成,前兩個為運算元(operand),第三個為回傳型別,所以以下實際舉個例子,定義一個繼承自 binary_function 的結構,名為 Less。
// 自訂函式物件的結構,並繼承自 binary_function
template <class _Tp> 
struct Less : public binary_function<_Tp, _Tp, bool>
{
 bool operator() (const _Tp& __x, const _Tp& __y) const
 {
  return __x < __y;
 }
};
接著透過 adjust 函式來使用束縛函式,並配合上面所定義的 Less 函式物件結構:
// 若資料小於門檻值,就直接調整成門檻值
template &ltclass Iter, class Fn, class T&gt  
void adjust( Iter itr1 , Iter itr2 , Fn fn, T threshold ) {
 for (; itr1 != itr2; ++itr1 )
 {
  if (fn(*itr1)) *itr1 = threshold ;
 }
}

int main() {
 srand((unsigned)time(NULL));

 int i;
 const int SIZE = 10;
 const int THRESHOLD = 50;

 vector<int> data1(SIZE);
 for (i = 0; i < SIZE; ++i) data1[i] = rand()%100+1;

 cout << "original data: ";      
 for (i = 0; i < SIZE; ++i) cout << data1[i] << ' ';      
 cout << endl;

 adjust(data1.begin(), data1.end(),
    bind1st(Less<int>(), THRESHOLD), THRESHOLD);

 cout << "changed data: ";      
 for (i = 0; i < SIZE; data1[i]; ++i) cout << data1[i] << ' ';
 cout << endl;
 return 0;
}
輸出結果:
original data: 58 25 13 96 11 47 68 33 86 35
changed data: 50 25 13 50 11 47 50 33 50 35

因此,只要繼承 binary_function,自訂的函式物件結構也能使用束縛函式。另外還有一個稱作否定函式,對象是單元的函式物件,所以只要自訂的函式物件結構去繼承 unary_function 即可。

沒有留言:

 
Blogger Templates