📄 autobook_146.html
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12 2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) Karl Berry <karl@freefriends.org> Olaf Bachmann <obachman@mathematik.uni-kl.de> and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Templates</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Templates"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Templates"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!-- // Check the browser version. function checkVersion() { if (navigator.appVersion.charAt(0)>=3) return true; if (navigator.appVersion.charAt(0)>=4) return true; else return false; } if (checkVersion()) { homeon = new Image(); homeon.src = "homeon.png"; homeoff = new Image(); homeoff.src = "home.png"; tocon = new Image(); tocon.src = "tocon.png"; tocoff = new Image(); tocoff.src = "toc.png"; indexon = new Image(); indexon.src = "indexon.png"; indexoff = new Image(); indexoff.src = "index.png"; helpon = new Image(); helpon.src = "helpon.png"; helpoff = new Image(); helpoff.src = "help.png"; backon = new Image(); backon.src = "backon.png"; backoff = new Image(); backoff.src = "back.png"; forwardon = new Image(); forwardon.src = "forwardon.png"; forwardoff = new Image(); forwardoff.src = "forward.png"; prevon = new Image(); prevon.src = "prevon.png"; prevoff = new Image(); prevoff.src = "prev.png"; nexton = new Image(); nexton.src = "nexton.png"; nextoff = new Image(); nextoff.src = "next.png"; upon = new Image(); upon.src = "upon.png"; upoff = new Image(); upoff.src = "up.png"; } function img_act(imgName) { if (checkVersion()) { imgOn = eval(imgName + "on.src"); document [imgName].src = imgOn; } } function img_inact(imgName) { if (checkVersion()) { imgOff = eval(imgName + "off.src"); document [imgName].src = imgOff; } }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC146"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_145.html#SEC145" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Runtime Type Identification (RTTI)" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_147.html#SEC147" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: Default template arguments" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_138.html#SEC138" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: Exceptions" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_136.html#SEC136" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Changeable C++" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_150.html#SEC150" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Compiler Quirks" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 16.2.10 Templates </H3><!--docid::SEC146::--><P>Templates--known in other languages as <EM>generic types</EM>---permityou to write C++ classes which represent parameterized data types. Acommon application for <EM>class templates</EM> is container classes.That is, classes which implement data structures that can contain dataof any type. For instance, a well-implemented binary tree is notinterested in the type of data in its nodes. Templates have undergone anumber of changes since their initial inclusion in the ARM. They are aparticularly troublesome C++ language element in that it is difficult toimplement templates well in a C++ compiler.</P><P>Here is a fictitious and overly simplistic C++ class template thatimplements a fixed-sized stack. It provides a pair of methods forsetting (and getting) the element at the bottom of the stack. It usesthe modern C++ template syntax, including the new <CODE>typename</CODE>keyword (see section <A HREF="autobook_144.html#SEC144">16.2.8 The <CODE>typename</CODE> Keyword</A>).</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>template <typename T> class Stack{public: T first () { return stack[9]; } void set_first (T t) { stack[9] = t; }private: T stack[10];};</pre></td></tr></table></P><P>C++ permits this class to be instantiated for any type you like, usingcalling code that looks something like this:</P><P><TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>intmain (){ Stack<int> s; s.set_first (7); cout << s.first () << endl; return 0;}</FONT></pre></td></tr></table></P><P>An old trick for fashioning class templates is to use the Cpreprocessor. Here is our limited <CODE>Stack</CODE> class, rewritten toavoid C++ templates:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>#define Stack(T) \ class Stack__##T##__LINE__ \ { \ public: \ T first () { return stack[0]; } \ void set_first (T t) { stack[0] = t; } \ \ private: \ T stack[10]; \ }</pre></td></tr></table></P><P>There is a couple of subtleties being used here that should behighlighted. This generic class declaration uses the C preprocessoroperator <SAMP>`##'</SAMP> to generate a type name which is unique amongststacks of any type. The <CODE>__LINE__</CODE> macro is defined by thepreprocessor and is used here to maintain unique names when the templateis instantiated multiple times. The trailing semicolon that must followa class declaration has been omitted from the macro.</P><P><TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre>intmain (){ Stack (int) s; s.set_first (7); cout << s.first () << endl; return 0;}</FONT></pre></td></tr></table></P><P>The syntax for instantiating a <CODE>Stack</CODE> is slightly different tomodern C++, but it does work relatively well, since the C++ compilerstill applies type checking after the preprocessor has expanded themacro. The main problem is that unless you go to great lengths, thegenerated type name (such as <CODE>Stack__int</CODE>) could collide with otherinstances of the same type in the program.</P><P><A NAME="Default template arguments"></A></TR></TABLE><BR> <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12 2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -