250 lines
33 KiB
HTML
250 lines
33 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>std::bind</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_utility_functional_bind skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>bind</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-utility.html">utility</a>‎ | <a href="cpp-utility-functional.html">functional</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-functional.html"><functional></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody class="t-dcl-rev t-dcl-rev-num">
|
|
<tr class="t-dcl-rev-aux">
|
|
<td></td>
|
|
<td rowspan="142">(1)</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11 t-until-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> F, <span class="kw1">class</span>... <span class="me1">Args</span> <span class="sy1">></span><br />
|
|
<span class="coMULTI">/*unspecified*/</span> bind<span class="br0">(</span> F<span class="sy3">&&</span> f, Args<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> F, <span class="kw1">class</span>... <span class="me1">Args</span> <span class="sy1">></span><br />
|
|
<span class="kw4">constexpr</span> <span class="coMULTI">/*unspecified*/</span> bind<span class="br0">(</span> F<span class="sy3">&&</span> f, Args<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody></tbody>
|
|
<tbody class="t-dcl-rev t-dcl-rev-num">
|
|
<tr class="t-dcl-rev-aux">
|
|
<td></td>
|
|
<td rowspan="142">(2)</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11 t-until-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> R, <span class="kw1">class</span> F, <span class="kw1">class</span>... <span class="me1">Args</span> <span class="sy1">></span><br />
|
|
<span class="coMULTI">/*unspecified*/</span> bind<span class="br0">(</span> F<span class="sy3">&&</span> f, Args<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx20">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> R, <span class="kw1">class</span> F, <span class="kw1">class</span>... <span class="me1">Args</span> <span class="sy1">></span><br />
|
|
<span class="kw4">constexpr</span> <span class="coMULTI">/*unspecified*/</span> bind<span class="br0">(</span> F<span class="sy3">&&</span> f, Args<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>函数模板 <code>bind</code> 生成 <code>f</code> 的转发调用包装器。调用此包装器等价于以一些绑定到 <code>args</code> 的参数调用 <code>f</code> 。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>f</td>
|
|
<td>-</td>
|
|
<td><a href="cpp-named_req-Callable.html"><span style="font-style:italic">可调用</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Callable)</span></a> 对象(函数对象、指向函数指针、到函数引用、指向成员函数指针或指向数据成员指针)</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>args</td>
|
|
<td>-</td>
|
|
<td>要绑定的参数列表,未绑定参数为命名空间 <code>std::placeholders</code> 的占位符 <code>_1, _2, _3...</code> 所替换</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>未指定类型 <code>T</code> 的函数对象,满足 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-is_bind_expression.html"><span class="kw1052">std::<span class="me2">is_bind_expression</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span> <span class="sy1">==</span> <span class="kw2">true</span></span></span> 。它有下列属性:</p>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="std::bind_.E8.BF.94.E5.9B.9E.E7.B1.BB.E5.9E.8B"><span style="font-size:0.7em; line-height:130%">std::bind</span> <i>返回类型</i></span></h2>
|
|
<h4><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.AF.B9.E8.B1.A1">成员对象</span></h4>
|
|
<p><code>std::bind</code> 的返回类型保有从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>F<span class="sy1">></span><span class="br0">(</span>f<span class="br0">)</span></span></span> 构造的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-decay.html"><span class="kw628">std::<span class="me2">decay</span></span></a><span class="sy1"><</span>F<span class="sy1">></span><span class="sy4">::</span><span class="me2">type</span></span></span> 类型成员对象,和对于每个 <code>args...</code> 类型为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-decay.html"><span class="kw628">std::<span class="me2">decay</span></span></a><span class="sy1"><</span>Arg_i<span class="sy1">></span><span class="sy4">::</span><span class="me2">type</span></span></span> 的各一个对象,类似地从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>Arg_i<span class="sy1">></span><span class="br0">(</span>arg_i<span class="br0">)</span></span></span> 构造。</p>
|
|
<h4><span class="mw-headline" id=".E6.9E.84.E9.80.A0.E5.87.BD.E6.95.B0">构造函数</span></h4>
|
|
<p>若 <code>std::bind</code> 的返回类型的所有成员类型(说明如上)为<a href="cpp-named_req-CopyConstructible.html"><span style="font-style:italic">可复制构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyConstructible)</span></a> ,则它为可复制构造 (CopyConstructible) ,否则为<a href="cpp-named_req-MoveConstructible.html"><span style="font-style:italic">可移动构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(MoveConstructible)</span></a> 。类型定义下列成员:</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx20">
|
|
<td>
|
|
<h4><span class="mw-headline" id=".E6.88.90.E5.91.98.E7.B1.BB.E5.9E.8B_result_type">成员类型 <code>result_type</code></span></h4>
|
|
<p>1) <span class="t-mark-rev t-deprecated-cxx17">(C++17 中弃用)</span> 若 <code>F</code> 是指向函数或指向成员函数指针,则 <code>result_type</code> 是 <code>F</code> 的返回类型。若 <code>F</code> 是有嵌套 typedef <code>result_type</code> 的类类型,则 <code>result_type</code> 是 <code>F::result_type</code> 。否则不定义 <code>result_type</code> 。</p>
|
|
<p>2) <span class="t-mark-rev t-deprecated-cxx17">(C++17 中弃用)</span> <code>result_type</code> 准确地为 <code>R</code> 。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0_operator.28.29">成员函数 <code>operator()</code></span></h4>
|
|
<p>给定从先前到 <code>bind</code> 调用获得的对象 <code>g</code> ,从函数调用表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">g<span class="br0">(</span>u1, u2, ... <span class="me1">uM</span><span class="br0">)</span></span></span> 调用它时,发生被存储对象的调用,如同以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-invoke.html"><span class="kw1057">std::<span class="me2">invoke</span></span></a><span class="br0">(</span>fd, <a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>V1<span class="sy1">></span><span class="br0">(</span>v1<span class="br0">)</span>, <a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>V2<span class="sy1">></span><span class="br0">(</span>v2<span class="br0">)</span>, ..., <a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>VN<span class="sy1">></span><span class="br0">(</span>vN<span class="br0">)</span><span class="br0">)</span></span></span> ,其中 <code>fd</code> 是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-decay.html"><span class="kw629">std::<span class="me2">decay_t</span></span></a><span class="sy1"><</span>F<span class="sy1">></span></span></span> 类型值,受绑定 <code>v1, v2, ..., vN</code> 参数的值和类型按以下方式确定。</p>
|
|
<ul>
|
|
<li>若存储的参数 <code>arg</code> 拥有类型 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-reference_wrapper.html"><span class="kw1067">std::<span class="me2">reference_wrapper</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span> (例如,在起始的到 <code>bind</code> 调用中使用了 <span class="t-lc"><a href="cpp-utility-functional-ref.html">std::ref</a></span> 或 <span class="t-lc"><a href="cpp-utility-functional-ref.html">std::cref</a></span> ),则上述 <code>std::invoke</code> 调用中的 <code>vn</code> 是 <code>arg.get()</code> 且同一调用中的类型 <code>Vn</code> 是 <code>T&</code> :存储的参数按引用传递进入被调用的函数对象。</li>
|
|
<li>若存储的参数 <code>arg</code> 拥有类型 <code>T</code> 并满足 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-is_bind_expression.html"><span class="kw1052">std::<span class="me2">is_bind_expression</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span> <span class="sy1">==</span> <span class="kw2">true</span></span></span> (例如,直接传递到起始的对 <code>bind</code> 调用的另一 <code>bind</code> 表达式),则 <code>bind</code> 进行函数组合:不是传递该 bind 子表达式将返回的函数对象,而是饥渴地调用该子表达式,并将其返回值传递给外层可调用对象。若 bind 子表达式拥有任何占位符参数,则将它们与外层 bind 共享(从 <code>u1, u2, ...</code> 中选出)。特别是,上述 <code>std::invoke</code> 调用中的参数 <code>vn</code> 是 <code>arg(std::forward<Uj>(uj)...)</code> 而同一调用中的类型 <code>Vn</code> 是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-result_of.html"><span class="kw640">std::<span class="me2">result_of_t</span></span></a><span class="sy1"><</span>T cv <span class="sy3">&</span><span class="br0">(</span>Uj<span class="sy3">&&</span>...<span class="br0">)</span><span class="sy1">></span><span class="sy3">&&</span></span></span> ( cv 限定与 <code>g</code> 的相同)。</li>
|
|
<li>若存储的参数 <code>arg</code> 拥有类型 <code>T</code> 并满足 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-is_placeholder.html"><span class="kw1053">std::<span class="me2">is_placeholder</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">0</span></span></span> (表示以如 <code>std::placeholders::_1, _2, _3, ...</code> 的占位符为到 <code>bind</code> 初始调用的参数),则将占位符所指示的参数( <code>_1</code> 的 <code>u1</code> 、 <code>_2</code> 的 <code>u2</code> 等)传递给可调用对象:上述 <code>std::invoke</code> 调用中的参数 <code>vn</code> 是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>Uj<span class="sy1">></span><span class="br0">(</span>uj<span class="br0">)</span></span></span> 而同一调用中对应类型 <code>Vn</code> 是 <span class="t-c"><span class="mw-geshi cpp source-cpp">Uj<span class="sy3">&&</span></span></span> 。</li>
|
|
<li>否则,普通的存储参数 <code>arg</code> 作为左值参数传递给:上述 <code>std::invoke</code> 调用中的参数 <code>vn</code> 单纯地是 <code>arg</code> 且对应类型 <code>Vn</code> 是 <code>T cv &</code> ,其中 cv 是与 <code>g</code> 相同的 cv 限定。</li>
|
|
</ul>
|
|
<p>若提供于到 <code>g()</code> 调用的一些参数不匹配存储于 <code>g</code> 的任何占位符,则求值并忽略未使用的参数。</p>
|
|
<p>若 <code>g</code> 为 volatile 限定(即其 cv 限定符是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">volatile</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">volatile</span></span></span> ),则行为未定义。</p>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.82.E5.B8.B8">异常</span></h3>
|
|
<p>仅若从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>F<span class="sy1">></span><span class="br0">(</span>f<span class="br0">)</span></span></span> 构造 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-decay.html"><span class="kw628">std::<span class="me2">decay</span></span></a><span class="sy1"><</span>F<span class="sy1">></span><span class="sy4">::</span><span class="me2">type</span></span></span> 抛出,或从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1116">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>Arg_i<span class="sy1">></span><span class="br0">(</span>arg_i<span class="br0">)</span></span></span> 构造对应的任何 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-decay.html"><span class="kw628">std::<span class="me2">decay</span></span></a><span class="sy1"><</span>Arg_i<span class="sy1">></span><span class="sy4">::</span><span class="me2">type</span></span></span> 抛出才抛出异常,其中 <code>Arg_i</code> 是 <code>Args... args</code> 中第 i 个类型,而 <code>arg_i</code> 是第 i 个参数。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>如<a href="cpp-named_req-Callable.html"><span style="font-style:italic">可调用</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Callable)</span></a> 中描述,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> 与 <span class="t-lc"><a href="cpp-memory-unique_ptr.html">std::unique_ptr</a></span>),指向将访问其成员的对象。</p>
|
|
<p>到 bind 的参数被复制或移动,而且决不按引用传递,除非包装于 <span class="t-lc"><a href="cpp-utility-functional-ref.html">std::ref</a></span> 或 <span class="t-lc"><a href="cpp-utility-functional-ref.html">std::cref</a></span> 。</p>
|
|
<p>允许同一 bind 表达式中的多重占位符(例如多个 <code>_1</code> ),但结果仅若对应参数( <code>u1</code> )是左值或不可移动右值才良好定义。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="co2">#include <random></span>
|
|
<span class="co2">#include <iostream></span>
|
|
<span class="co2">#include <memory></span>
|
|
<span class="co2">#include <functional></span>
|
|
|
|
<span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">int</span> n1, <span class="kw4">int</span> n2, <span class="kw4">int</span> n3, <span class="kw4">const</span> <span class="kw4">int</span><span class="sy3">&</span> n4, <span class="kw4">int</span> n5<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> n1 <span class="sy1"><<</span> <span class="st0">' '</span> <span class="sy1"><<</span> n2 <span class="sy1"><<</span> <span class="st0">' '</span> <span class="sy1"><<</span> n3 <span class="sy1"><<</span> <span class="st0">' '</span> <span class="sy1"><<</span> n4 <span class="sy1"><<</span> <span class="st0">' '</span> <span class="sy1"><<</span> n5 <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">int</span> n1<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">return</span> n1<span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw1">struct</span> Foo <span class="br0">{</span>
|
|
<span class="kw4">void</span> print_sum<span class="br0">(</span><span class="kw4">int</span> n1, <span class="kw4">int</span> n2<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> n1<span class="sy2">+</span>n2 <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">int</span> data <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">using</span> <span class="kw1">namespace</span> <a href="cpp-utility-functional-placeholders.html"><span class="kw1060">std::<span class="me2">placeholders</span></span></a><span class="sy4">;</span> <span class="co1">// 对于 _1, _2, _3...</span>
|
|
|
|
<span class="co1">// 演示参数重排序和按引用传递</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">7</span><span class="sy4">;</span>
|
|
<span class="co1">// ( _1 与 _2 来自 std::placeholders ,并表示将来会传递给 f1 的参数)</span>
|
|
<span class="kw4">auto</span> f1 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span>f, _2, <span class="nu0">42</span>, _1, <a href="cpp-utility-functional-ref.html"><span class="kw1069">std::<span class="me2">cref</span></span></a><span class="br0">(</span>n<span class="br0">)</span>, n<span class="br0">)</span><span class="sy4">;</span>
|
|
n <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span>
|
|
f1<span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">1001</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 1 为 _1 所绑定, 2 为 _2 所绑定,不使用 1001</span>
|
|
<span class="co1">// 进行到 f(2, 42, 1, n, 7) 的调用</span>
|
|
|
|
<span class="co1">// 嵌套 bind 子表达式共享占位符</span>
|
|
<span class="kw4">auto</span> f2 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span>f, _3, std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span>g, _3<span class="br0">)</span>, _3, <span class="nu0">4</span>, <span class="nu0">5</span><span class="br0">)</span><span class="sy4">;</span>
|
|
f2<span class="br0">(</span><span class="nu0">10</span>, <span class="nu0">11</span>, <span class="nu0">12</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 进行到 f(12, g(12), 12, 4, 5); 的调用</span>
|
|
|
|
<span class="co1">// 常见使用情况:以分布绑定 RNG</span>
|
|
<a href="cpp-numeric-random.html"><span class="kw1495">std::<span class="me2">default_random_engine</span></span></a> e<span class="sy4">;</span>
|
|
<a href="cpp-numeric-random-uniform_int_distribution.html"><span class="kw1501">std::<span class="me2">uniform_int_distribution</span></span></a><span class="sy1"><></span> d<span class="br0">(</span><span class="nu0">0</span>, <span class="nu0">10</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-utility-functional-function.html"><span class="kw1058">std::<span class="me2">function</span></span></a><span class="sy1"><</span><span class="kw4">int</span><span class="br0">(</span><span class="br0">)</span><span class="sy1">></span> rnd <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span>d, e<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// e 的一个副本存储于 rnd</span>
|
|
<span class="kw1">for</span><span class="br0">(</span><span class="kw4">int</span> n<span class="sy1">=</span><span class="nu0">0</span><span class="sy4">;</span> n<span class="sy1"><</span><span class="nu0">10</span><span class="sy4">;</span> <span class="sy2">++</span>n<span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> rnd<span class="br0">(</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">' '</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 绑定指向成员函数指针</span>
|
|
Foo foo<span class="sy4">;</span>
|
|
<span class="kw4">auto</span> f3 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span><span class="sy3">&</span>Foo<span class="sy4">::</span><span class="me2">print_sum</span>, <span class="sy3">&</span>foo, <span class="nu0">95</span>, _1<span class="br0">)</span><span class="sy4">;</span>
|
|
f3<span class="br0">(</span><span class="nu0">5</span><span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 绑定指向数据成员指针</span>
|
|
<span class="kw4">auto</span> f4 <span class="sy1">=</span> std<span class="sy4">::</span><span class="me2">bind</span><span class="br0">(</span><span class="sy3">&</span>Foo<span class="sy4">::</span><span class="me2">data</span>, _1<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> f4<span class="br0">(</span>foo<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="co1">// 智能指针亦能用于调用被引用对象的成员</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1757">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> f4<span class="br0">(</span><a href="cpp-memory-shared_ptr-make_shared.html"><span class="kw736">std::<span class="me2">make_shared</span></span></a><span class="sy1"><</span>Foo<span class="sy1">></span><span class="br0">(</span>foo<span class="br0">)</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> f4<span class="br0">(</span><a href="cpp-memory-unique_ptr-make_unique.html"><span class="kw735">std::<span class="me2">make_unique</span></span></a><span class="sy1"><</span>Foo<span class="sy1">></span><span class="br0">(</span>foo<span class="br0">)</span><span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">2 42 1 10 7
|
|
12 12 12 4 5
|
|
1 5 0 2 0 8 2 2 10 8
|
|
100
|
|
10
|
|
10
|
|
10</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-functional-bind_front.html"><span class="t-lines"><span>bind_front</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按顺序绑定一定数量的参数到函数对象<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-functional-placeholders.html"><span class="t-lines"><span>_1, _2, _3, _4, ...</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>用作 <code>std::bind</code> 表达式中的未绑定实参的占位符<br />
|
|
<span class="t-mark">(常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-functional-mem_fn.html"><span class="t-lines"><span>mem_fn</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>从成员指针创建出函数对象<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|