针对函数对象的多态包装器(又称多态函数对象包装器)在语义和语法上和函数指针相似,但不像函数指针那么狭隘。只要能被调用,且其参数能与包装器兼容的都能以多态函数对象包装器称之(函数指针,成员函数指针或仿函数)。
通过以下例子,我们可以了解多态函数对象包装器的特性:
std::function<int (int, int)> func; // 利用樣板類 'function' // 建立包裝器 std::plus<int> add; // 'plus' 被宣告為 'template<class T> T plus( T, T ) ;' // 因此 'add' 的型別是 'int add( int x, int y )' func = &add; // 可行。'add' 的型參和回返值型別與 'func' 相符 int a = func (1, 2); // 注意: 若包裝器 'func' 沒有參考到任何函式 // 會丟出 'std::bad_function_call' 例外 std::function<bool (short, short)> func2 ; if(!func2) { // 因為尚未賦值與 'func2' 任何函式,此條件式為真 bool adjacent(long x, long y); func2 = &adjacent ; // 可行。'adjacent' 的型參和回返值型別可透過型別轉換進而與 'func2' 相符 struct Test { bool operator()(short x, short y); }; Test car; func = std::ref(car); // 樣板類 'std::ref' 回傳一個 struct 'car' // 其成員函式 'operator()' 的包裝 } func = func2; // 可行。'func2' 的型參和回返值型別可透過型別轉換進而與 'func' 相符
模板类 function
将定义在头文件 <functional>
,而不须更动到语言本身。