104 lines
12 KiB
HTML
104 lines
12 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>变量模板(C++14 起)</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_language_variable_template skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">变量模板<span class="t-mark-rev t-since-cxx14">(C++14 起)</span></h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>变量模板定义一族变量或静态数据成员。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>template</b></code> <code><b><</b></code> <span class="t-spar">形参列表</span> <code><b>></b></code> <span class="t-spar">变量声明</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">变量声明</span></td>
|
|
<td>-</td>
|
|
<td>变量的<a href="cpp-language-declarations.html">声明</a>。声明的变量名成为模板名。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">形参列表</span></td>
|
|
<td>-</td>
|
|
<td>非空的<a href="cpp-language-template_parameters.html">模板形参</a>的逗号分隔列表,每项是<a href="cpp-language-template_parameters.html#.E9.9D.9E.E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">非类型形参</a>、<a href="cpp-language-template_parameters.html#.E7.B1.BB.E5.9E.8B.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">类型形参</a>、<a href="cpp-language-template_parameters.html#.E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">模板形参</a>,或任何上述的<a href="cpp-language-parameter_pack.html">形参包</a>之一。</td>
|
|
</tr>
|
|
</table>
|
|
<p>变量模板可以通过处于命名空间作用域中的模板声明引入,其中 <span class="t-spar">声明</span> 声明一个变量。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
<span class="kw4">constexpr</span> T pi <span class="sy1">=</span> T<span class="br0">(</span>3.1415926535897932385L<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 变量模板</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
T circular_area<span class="br0">(</span>T r<span class="br0">)</span> <span class="co1">// 函数模板</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">return</span> pi<span class="sy1"><</span>T<span class="sy1">></span> <span class="sy2">*</span> r <span class="sy2">*</span> r<span class="sy4">;</span> <span class="co1">// pi<T> 是变量模板实例化</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>在类作用域中使用时,变量模板声明一个静态数据成员模板。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">using</span> <span class="kw1">namespace</span> std<span class="sy4">::</span><span class="me2">literals</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> matrix_constants
|
|
<span class="br0">{</span>
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
<span class="kw1">using</span> pauli <span class="sy1">=</span> hermitian_matrix<span class="sy1"><</span>T, <span class="nu0">2</span><span class="sy1">></span><span class="sy4">;</span> <span class="co1">// 别名模版</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span> <span class="co1">// 静态数据成员模板</span>
|
|
<span class="kw4">static</span> <span class="kw4">constexpr</span> pauli<span class="sy1"><</span>T<span class="sy1">></span> sigmaX <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">{</span> <span class="nu0">0</span>, <span class="nu0">1</span> <span class="br0">}</span>, <span class="br0">{</span> <span class="nu0">1</span>, <span class="nu0">0</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
<span class="kw4">static</span> <span class="kw4">constexpr</span> pauli<span class="sy1"><</span>T<span class="sy1">></span> sigmaY <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">{</span> <span class="nu0">0</span>, <span class="sy2">-</span>1i <span class="br0">}</span>, <span class="br0">{</span> 1i, <span class="nu0">0</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
<span class="kw4">static</span> <span class="kw4">constexpr</span> pauli<span class="sy1"><</span>T<span class="sy1">></span> sigmaZ <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">{</span> <span class="nu0">1</span>, <span class="nu0">0</span> <span class="br0">}</span>, <span class="br0">{</span> <span class="nu0">0</span>, <span class="sy2">-</span><span class="nu0">1</span> <span class="br0">}</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="br0">}</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>与其他<a href="cpp-language-static.html">静态成员</a>一样,静态数据成员模板的需要一个定义。这种定义可以在类定义外提供。处于命名空间作用域的静态数据成员的模板声明也可以是<a href="cpp-language-member_template.html">类模板的非模板数据成员</a>的定义:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">struct</span> limits <span class="br0">{</span>
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">typename</span> T<span class="sy1">></span>
|
|
<span class="kw4">static</span> <span class="kw4">const</span> T min<span class="sy4">;</span> <span class="co1">// 静态数据成员模板的声明</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">typename</span> T<span class="sy1">></span>
|
|
<span class="kw4">const</span> T limits<span class="sy4">::</span><span class="me2">min</span> <span class="sy1">=</span> <span class="br0">{</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 静态数据成员模板的定义</span>
|
|
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
<span class="kw1">class</span> X <span class="br0">{</span>
|
|
<span class="kw4">static</span> T s<span class="sy4">;</span> <span class="co1">// 类模板的非模板静态数据成员的声明</span>
|
|
<span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> T<span class="sy1">></span>
|
|
T X<span class="sy1"><</span>T<span class="sy1">></span><span class="sy4">::</span><span class="me2">s</span> <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="co1">// 类模板的非模板静态数据成员的定义</span></pre></div>
|
|
</div>
|
|
<p>除非变量模板被<a href="cpp-language-template_specialization.html">显式特化</a>或显式实例化,否则在变量模板的特化在要求<a href="cpp-language-definition.html#ODR_.E4.BD.BF.E7.94.A8">变量定义存在</a>的语境中被引用,或定义存在与否影响程序语义时,即表达式(可能不使用定义)<a href="cpp-language-constant_expression.html#.E5.B8.B8.E9.87.8F.E6.B1.82.E5.80.BC.E6.89.80.E9.9C.80.E8.A6.81.E7.9A.84.E5.87.BD.E6.95.B0.E4.B8.8E.E5.8F.98.E9.87.8F">对常量求值需要</a>该变量时,隐式实例化它。</p>
|
|
<p>如果有表达式需要某变量进行常量求值,那么变量定义存在与否会影响程序语义,即使不要求常量求值表达式,或常量表达式求值不使用该定义。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>在 C++14 引入变量模板前,参数化变量通常实现为类模板的静态数据成员,或返回所需值的 constexpr 函数模板。</p>
|
|
<p>变量模板不能用作<a href="cpp-language-template_parameters.html#.E6.A8.A1.E6.9D.BF.E6.A8.A1.E6.9D.BF.E5.AE.9E.E5.8F.82">模板模板实参</a>。</p>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|