<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # std::function 和 std::bind 標準庫函數bind()和function()定義于頭文件`<functional>`中(該頭文件還包括許多其他函數對象),用于處理函數及函數參數。bind()接受一個函數(或者函數對象,或者任何你可以通過”(…)”符號調用的事物),生成一個其有某一個或多個函數參數被“綁定”或重新組織的函數對象。(譯注:顧名思義,bind()函數的意義就像它的函數名一樣,是用來綁定函數調用的某些參數的。)例如: ``` int f(int, char, double); // 綁定f()函數調用的第二個和第三個參數, // 返回一個新的函數對象為ff,它只帶有一個int類型的參數 auto ff = bind(f, _1, ‘c’, 1.2); int x = ff(7); // f(7, ‘c’, 1.2); ``` 參數的綁定通常稱為”Currying”(譯注:Currying—“烹制咖喱燒菜”,此處意指對函數或函數對象進行加工修飾操作), “\_1″是一個占位符對象,用于表示當函數f通過函數ff進行調用時,函數ff的第一個參數在函數f的參數列表中的位置。第一個參數稱為”\_1″, 第二個參數為”\_2″,依此類推。例如: ``` int f(int, char, double); auto frev = bind(f, _3, _2, _1); // 翻轉參數順序 int x = frev(1.2, ‘c’, 7); // f(7, ‘c’, 1.2); ``` 此處,auto關鍵字節約了我們去推斷bind返回的結果類型的工作。 我們無法使用bind()綁定一個重載函數的參數,我們必須顯式地指出需要綁定的重載函數的版本: ``` int g(int); double g(double); auto g1 = bind(g, _1); // 錯誤:調用哪一個g() ? // 正確,但是相當丑陋 auto g2 = bind( (double(*)(double))g, _1); ``` bind()有兩種版本:一個如上所述,另一個則是“歷史遺留”的版本:你可以顯式地描述返回類型。例如: ``` auto f2 = bind<int> (f, 7, ‘c’, _1); // 顯式返回類型 int x = f2(1.2); // f(7, ‘c’, 1.2); ``` 第二種形式的存在是必要的,并且因為第一個版本((?) “and for a user simplest “,此處請參考原文))無法在C++98中實現。所以第二個版本已經被廣泛使用。 function是一個擁有任何可以以”(…)”符號進行調用的值的類型。特別地,bind的返回結果可以賦值給function類型。function十分易于使用。(譯注:更直觀地,可以把function看成是一種表示函數的數據類型,就像函數對象一樣。只不過普通的數據類型表示的是數據,function表示的是函數這個抽象概念。)例如: ``` // 構造一個函數對象, // 它能表示的是一個返回值為float, // 兩個參數為int,int的函數 function<float (int x, int y)> f; // 構造一個可以使用"()"進行調用的函數對象類型 struct int_div { float operator() (int x, int y) const { return ((float)x)/y; }; }; f = int_div(); // 賦值 cout<< f(5,3) <<endl; // 通過函數對象進行調用 std::accumulate(b, e, 1, f); // 完美傳遞 ``` 成員函數可被看做是帶有額外參數的自由函數: ``` struct X { int foo(int); }; // 所謂的額外參數, // 就是成員函數默認的第一個參數, // 也就是指向調用成員函數的對象的this指針 function<int (X*, int)> f; f = &X::foo; // 指向成員函數 X x; int v = f(&x, 5); // 在對象x上用參數5調用X::foo() function<int (int)> ff = std::bind(f, &x, _1); // f的第一個參數是&x v = ff(5); // 調用x.foo(5) ``` function對于回調函數、將操作作為參數傳遞等十分有用。它可以看做是C++98標準庫中函數對象mem_fun_t, pointer_to_unary_function等的替代品。同樣的,bind()也可以被看做是bind1st()和bind2nd()的替代品,當然比他們更強大更靈活。 參考: * Standard: 20.7.12 Function template bind, 20.7.16.2 Class template function * Herb Sutter:[Generalized Function Pointers](http://www.ddj.com/article/printableArticle.jhtml;jsessionid=QQIFSNAIOYXN0QSNDLPSKHSCJUNN2JVN?articleID=184403746&dept_url=/cpp/) . August 2003. * Douglas Gregor: [Boost.Function](http://www.boost.org/doc/libs/1_38_0/doc/html/function.html) . * Boost::bind (翻譯:dabaitu)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看