束縛函式可以對雙元的函式物件作限制,共分為兩種:
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 <class Iter, class Fn, class T>
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 即可。