呼叫全域性函式
呼叫全域性函式程式例項:
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 |
#include <iostream> #include <algorithm> #include <functional> #include <locale> #include <string> using namespace std; using namespace std::placeholders; char my_toupper(char c) { locale loc; return std::use_facet<std::ctype<char> >(loc).toupper(c); } int main() { string s("Internationalization"); string sub("Nation"); string::iterator pos; pos = search ( s.begin(), s.end(), sub.begin(), sub.end(), bind ( equal_to<char>(), bind(my_toupper, _1), bind(my_toupper, _2) ) ); if (pos != s.end()) { cout << "\"" << sub << "\" is part of\"" << s << "\"" << endl; } system("pause"); } |
執行結果:
“Nation” is part of”Internationalization”
請按任意鍵繼續. . .
程式分析:
本例採用search()演算法檢驗sub是否為s的一個子字串,大小寫不計。有了以下:
1 |
bind(equal_to<char>(),bind(my_toupper, _1),bind(my_toupper, _2)) |
便是建立一個function object 並相當於呼叫:
1 |
my_toupper(arg1) == my_toupper(arg2); |
注意:
bind( )內部會複製被傳入的實參。
若要改變這種行為,讓function object使用一個引用(reference)指向被傳入的實參,可利用ref()或cref():
例如:
1 2 3 4 5 6 7 |
void incr(int& i) { ++i; } int i =0; bind(incr, i)(); //僅僅一個拷貝 bind(incr, ref(i))(); //引用傳遞 |
呼叫成員函式
以下程式示範bind()如何被用來呼叫成員函式
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 |
#include <iostream> #include <functional> #include <algorithm> #include <vector> #include <string> using namespace std; using namespace std::placeholders; class Person { private: string name_; public: Person(const string& n) : name_(n) {} void print() const { cout << name_ << endl; } void print2(const string& prefix) const { cout << prefix << name_ << endl; } }; int main() { vector<Person> coll = { Person("csu"), Person("csru"), Person("csiu") }; //每個person物件呼叫成員函式 for_each(coll.begin(), coll.end(), bind(&Person::print, _1)); cout << endl; for_each(coll.begin(), coll.end(), bind(&Person::print2, _1, "Person: ")); cout << endl; bind(&Person::print2, _1, "This is : ")(Person("鐵道學院")); system("pause"); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* 執行結果 csu csru csiu Person: csu Person: csru Person: csiu This is : 鐵道學院 請按任意鍵繼續. . . */ |
程式分析:
程式中的bind(&Person::print, _1)
定義一個function object,其內針對傳入的Person呼叫param1.print(),
也就是說,由於第一實參是個成員函式,下一個引數將定義“用以呼叫成員函式”的物件。
其他任何實參都會被傳遞給該成員函式。這意味著:
1 |
bind(&Person::print2, _1, "Person: ") |
定義出一個function object,其內針對傳入Person呼叫param1.print2("Person:")
。
Lambda實現呼叫全域性函式及類成員函式
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 |
//全域性函式 #include <iostream> #include <algorithm> #include <locale> #include <string> using namespace std; char my_toupper(char c) { std::locale loc; return std::use_facet<std::ctype<char>>(loc).toupper(c); } int main() { string s("Internationalizition"); string sub("Nation"); string::iterator pos; pos = search(s.begin(), s.end(), sub.begin(), sub.end(), [](char c1, char c2){ return my_toupper(c1) == my_toupper(c2); } ); if (pos != s.end()) { cout << sub << " is part of " << s << endl; } system("pause"); } /* Nation is part of Internationalizition 請按任意鍵繼續. . . */ |
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 60 61 62 63 |
//類成員函式 #include <iostream> #include <functional> #include <algorithm> #include <vector> #include <string> using namespace std; using namespace std::placeholders; class Person { private: string name_; public: Person(const string& n) : name_(n) {} void print() const { cout << name_ << endl; } void print2(const string& str) const { cout << str << name_ << endl; } }; int main() { vector<Person> coll = { Person("csu"), Person("csru"), Person("csiu") }; for_each(coll.begin(), coll.end(), [](const Person& p){ p.print(); }); cout << endl; for_each(coll.begin(), coll.end(), [](const Person& p){ p.print2("Person: "); }); system("pause"); } /* csu csru csiu Person: csu Person: csru Person: csiu 請按任意鍵繼續. . . */ |