C++11之std::function和std::bind

来源:http://www.cnblogs.com/jiayayao/archive/2016/12/06/6139201.html
-Advertisement-
Play Games

std::function是可調用對象的包裝器,它最重要的功能是實現延時調用: 由上邊代碼定義std::function<int(int)> fr2,那麼fr2就可以代表返回值和參數表相同的一類函數。可以看出fr2保存了指代的函數,可以在之後的程式過程中調用。這種用法在實際編程中是很常見的。 std ...


  std::function是可調用對象的包裝器,它最重要的功能是實現延時調用:

#include "stdafx.h"
#include<iostream>// std::cout
#include<functional>// std::function

void func(void)
{
    std::cout << __FUNCTION__ << std::endl;
}

class Foo
{
public:
    static int foo_func(int a)
    {
        std::cout << __FUNCTION__ << "(" << a << ") ->: ";
        return a;
    }
};

class Bar
{
public:
    int operator() (int a)
    {
        std::cout << __FUNCTION__ << "(" << a << ") ->: ";
        return a;
    }
};

int main()
{
    // 綁定普通函數
    std::function<void(void)> fr1 = func;
    fr1();

    // 綁定類的靜態成員函數
    std::function<int(int)> fr2 = Foo::foo_func;
    std::cout << fr2(100) << std::endl;

    // 綁定仿函數
    Bar bar;
    fr2 = bar;
    std::cout << fr2(200) << std::endl;

    return 0;
}

  由上邊代碼定義std::function<int(int)> fr2,那麼fr2就可以代表返回值和參數表相同的一類函數。可以看出fr2保存了指代的函數,可以在之後的程式過程中調用。這種用法在實際編程中是很常見的。

  std::bind用來將可調用對象與其參數一起進行綁定。綁定後可以使用std::function進行保存,並延遲到我們需要的時候調用:

  (1) 將可調用對象與其參數綁定成一個仿函數;

  (2) 可綁定部分參數。

  在綁定部分參數的時候,通過使用std::placeholders來決定空位參數將會是調用發生時的第幾個參數。

#include "stdafx.h"
#include<iostream>// std::cout
#include<functional>// std::function

class A
{
public:
    int i_ = 0; // C++11允許非靜態(non-static)數據成員在其聲明處(在其所屬類內部)進行初始化

    void output(int x, int y)
    {
        std::cout << x << "" << y << std::endl;
    }

};

int main()
{
    A a;
    // 綁定成員函數,保存為仿函數
    std::function<void(int, int)> fr = std::bind(&A::output, &a, std::placeholders::_1, std::placeholders::_2);
    // 調用成員函數
    fr(1, 2);

    // 綁定成員變數
    std::function<int&(void)> fr2 = std::bind(&A::i_, &a);
    fr2() = 100;// 對成員變數進行賦值
    std::cout << a.i_ << std::endl;


    return 0;
}

 

  

  

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HostingEnvironment是承載應用當前執行環境的描述,它是對所有實現了IHostingEnvironment介面的所有類型以及對應對象的統稱。HostingEnvironment類型是對IHostingEnvironment介面的預設實現。對於通過HostingEnvironment的四... ...
  • 昨天朋友想做個圖片懶載入的效果,朋友是前端的,我這邊給他提供數據,程式寫好了放到伺服器上,本地測試訪問時卻報jquery跨域的問題,於是找度娘瞭解了一下jquey如何處理,網上有很多參考文章,但沒細看,此情況會造成知識的不全面,望諒解,找了兩個解決方案,具體如下: 1、直接在ashx中加入以下代碼: ...
  • 提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"錯誤的解決方案: 1.檢查是否有C:\Program Files (x86)\dotnet目錄。 如果沒有,下載DotNetCore.1.0.1-SDK.1.0.0.Preview2-003133-x ...
  • IO流技術 概念:input - output 輸入輸出流: 輸入:將文件讀到記憶體中; 輸出:將文件從記憶體中寫出到其他地方 作用:主要就是解決設備和設備之間的數據傳輸問題。 File :文件類的使用十分重要 (一)file的構造方法 (二)基本方法 (三)判斷方法 (四)獲取方法 (五)對文件的操作 ...
  • 需要的jar包:xmlpull_1_0_5.jar,xstream-1.4.1.jar) 1、工具類XstreamUtil package com.learn.util; import com.thoughtworks.xstream.XStream; import com.thoughtworks ...
  • pc的demo很多,不記。 移動端做支付的時候要先配置可測試功能變數名稱和授權功能變數名稱,一個在公眾平臺里的微信支付里配置 註意,獲取open的Id的方法需要寫到這個配置好的功能變數名稱下。否則會說功能變數名稱未授權。 還有一個是在微信支付里配置的授權功能變數名稱,在最下麵有個網頁授權,裡面配置你的測試功能變數名稱,然後需要下載一個文件,建議放 ...
  • 很長時間都沒有更新了,最近在補充JavaSE的一些細節部分 關於IO流的一些總結 首先要介紹的是File類,File類用於對文件和目錄的一些操作 1.創建文件CreateNewFile() 2.對文件的信息的獲取getName(),getAbsolutePath() 3.判斷是否是文件isFile( ...
  • 調用requonse.getWriter()方法時可實現文本字元串數據輸出,調用response.getOutputStream()方法可現實位元組流數據的輸出。兩種輸出方式threadlocal模式和osiv模式~~~!!!!threadlocal 是一個局部的線程變數 只是一個map 保存的是線程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...