Lambda函數的用處
假設你設計了一個地址簿的類。如今你要提供函數查詢這個地址簿,可能根據姓名查詢,可能根據地址查詢,還有可能二者結合。要是你爲這些狀況都寫個函數,那麼你必定就跪了。因此你應該提供一個接口,能方便地讓用戶自定義本身的查詢方式。在這裏能夠使用lambda函數來實現這個功能。
- #include <string>
- #include <vector>
-
- class AddressBook
- {
- public:
-
-
- template<typename Func>
- std::vector<std::string> findMatchingAddresses (Func func)
- {
- std::vector<std::string> results;
- for ( auto itr = _addresses.begin(), end = _addresses.end(); itr != end; ++itr )
- {
-
- if ( func( *itr ) )
- {
- results.push_back( *itr );
- }
- }
- return results;
- }
-
- private:
- std::vector<std::string> _addresses;
- };
從上面代碼能夠看到,findMatchingAddressses函數提供的參數是Func類型,這是一個泛型類型。在使用過程當中應該傳入一個函數,而後分別對地址簿中每個entry執行這個函數,若是返回值爲真那麼代表這個entry符合使用者的篩選要求,那麼就應該放入結果當中。那麼這個Func類型的參數如何傳入呢?
- AddressBook global_address_book;
-
- vector<string> findAddressesFromOrgs ()
- {
- return global_address_book.findMatchingAddresses(
-
- [] (const string& addr) { return addr.find( ".org" ) != string::npos; }
- );
- }
能夠看到,咱們在調用函數的時候直接定義了一個lambda函數。參數類型是
返回值是bool類型。
若是用戶要使用不一樣的方式查詢的話,只要定義不一樣的lambda函數就能夠了。