C++11/14介紹(三)——語言運行期的強化(二)

函數對象包裝器

一、std::function

Lambda表達式的本質是一個函數對象,當lambda表達式的捕獲列表爲空時,Lambda表達式還能作爲一個函數指針進行傳遞:

#include <iostream>

using foo = void (int);
void functional(foo f)
{
    f(1);
}

int main()
{
    auto f = [](int value)
    {
        std::cout<<value<<std::endl;
    };
    functional(f); //函數指針調用
    f(1);          //lambda表達式調用
    return 0;
}

std::function 是一種通用、多態的函數封裝,它的實例可以對任何可以調用的目標實體進行存儲、複製和調用操作,它也是對C++中現有的可調用實體的一種類型安全的包裹,就是函數的容器,這樣可以更加方便的將函數、函數指針作爲對象進行處理。例如:

#include <functional>
#include <iostream>

int foo(int para) {
    return para;
}

int main() {
    // std::function 包裝了一個返回值爲 int, 參數爲 int 的函數
    std::function<int(int)> func = foo;

    int important = 10;
    std::function<int(int)> func2 = [&](int value) -> int {
        return 1+value+important;
    };
    std::cout << func(10) << std::endl;
    std::cout << func2(10) << std::endl;
}

二、std::bind/std::placeholder

std::bind 是用來綁定函數調用的參數的,它解決的需求是:有時候可能並不一定能一次性獲得調用某個函數的全部參數。通過這個函數,可以將部分調用參數提前綁定到函數身上,成爲一個新的對象,然後在參數齊全後,完成調用:

#include <iostream>
#include <functional>

int foo(int a, int b, int c) {
    std::cout<<a<<" "<<b<<" "<<c;
    return 0;
}
int main() {
    // 將參數1,2綁定到函數 foo 上,但是使用 std::placeholders::_1 來對第一個參數進行佔位
    auto bindFoo = std::bind(foo, std::placeholders::_1, 1,2);
    // 這時調用 bindFoo 時,只需要提供第一個參數即可
    bindFoo(6);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章