A<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://cppe.ru/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B_Tutorial%2Ftemplate%2Ftemplate_parameter</id>
		<title>C++ Tutorial/template/template parameter - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://cppe.ru/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B_Tutorial%2Ftemplate%2Ftemplate_parameter"/>
		<link rel="alternate" type="text/html" href="http://cppe.ru/index.php?title=C%2B%2B_Tutorial/template/template_parameter&amp;action=history"/>
		<updated>2026-04-04T06:59:27Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://cppe.ru/index.php?title=C%2B%2B_Tutorial/template/template_parameter&amp;diff=2607&amp;oldid=prev</id>
		<title> в 14:21, 25 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://cppe.ru/index.php?title=C%2B%2B_Tutorial/template/template_parameter&amp;diff=2607&amp;oldid=prev"/>
				<updated>2010-05-25T14:21:17Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 14:21, 25 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://cppe.ru/index.php?title=C%2B%2B_Tutorial/template/template_parameter&amp;diff=2608&amp;oldid=prev</id>
		<title>Admin: 1 версия:&amp;#32;Импорт контента...</title>
		<link rel="alternate" type="text/html" href="http://cppe.ru/index.php?title=C%2B%2B_Tutorial/template/template_parameter&amp;diff=2608&amp;oldid=prev"/>
				<updated>2010-05-25T10:30:05Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия: Импорт контента...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Default template arguments==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
// T defaults to int and size defaults to 10&lt;br /&gt;
template &amp;lt;class T=int, int size=10&amp;gt; class MyType {&lt;br /&gt;
  T a[size];&lt;br /&gt;
public:&lt;br /&gt;
  MyType() {&lt;br /&gt;
    for(int i=0; i&amp;lt;size; i++)&lt;br /&gt;
       a[i] = i;&lt;br /&gt;
  }&lt;br /&gt;
  T &amp;amp;operator[](int i){&lt;br /&gt;
      if(i&amp;lt;0 || i&amp;gt; size-1) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;\nIndex value of &amp;quot;;&lt;br /&gt;
        cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; is out-of-bounds.\n&amp;quot;;&lt;br /&gt;
        exit(1);&lt;br /&gt;
      }&lt;br /&gt;
      return a[i];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  MyType&amp;lt;int, 100&amp;gt; intarray;&lt;br /&gt;
  MyType&amp;lt;double&amp;gt; doublearray;&lt;br /&gt;
  MyType&amp;lt;&amp;gt; defarray;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;int array: &amp;quot;;&lt;br /&gt;
  for(int i=0; i&amp;lt;100; i++)&lt;br /&gt;
     intarray[i] = i;&lt;br /&gt;
  for(int i=0; i&amp;lt;100; i++)&lt;br /&gt;
     cout &amp;lt;&amp;lt; intarray[i] &amp;lt;&amp;lt; &amp;quot;  &amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;double array: &amp;quot;;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     doublearray[i] = (double) i/3;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     cout &amp;lt;&amp;lt; doublearray[i] &amp;lt;&amp;lt; &amp;quot;  &amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;defarray array: &amp;quot;;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     defarray[i] = i;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     cout &amp;lt;&amp;lt; defarray[i] &amp;lt;&amp;lt; &amp;quot;  &amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;int array: 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34&lt;br /&gt;
 35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69&lt;br /&gt;
 70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99&lt;br /&gt;
double array: 0  0.333333  0.666667  1  1.33333  1.66667  2  2.33333  2.66667  3&lt;br /&gt;
defarray array: 0  1  2  3  4  5  6  7  8  9&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Define implicit_cast==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
template &amp;lt;typename DstT, typename SrcT&amp;gt;&lt;br /&gt;
inline DstT implicit_cast (SrcT const&amp;amp; x)  // SrcT can be deduced,&lt;br /&gt;
{                                          // but DstT cannot&lt;br /&gt;
    return x;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    double value = implicit_cast&amp;lt;double&amp;gt;(-1);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Demonstrate non-type template arguments==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
//int size is a non-type agument&lt;br /&gt;
template &amp;lt;class T, int size&amp;gt; class MyType {&lt;br /&gt;
  T a[size];&lt;br /&gt;
public:&lt;br /&gt;
  MyType() {&lt;br /&gt;
    for(int i=0; i&amp;lt;size; i++)&lt;br /&gt;
       a[i] = i;&lt;br /&gt;
  }&lt;br /&gt;
  T &amp;amp;operator[](int i){&lt;br /&gt;
      if(i&amp;lt;0 || i&amp;gt; size-1) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;\nIndex value of &amp;quot;;&lt;br /&gt;
        cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; is out-of-bounds.\n&amp;quot;;&lt;br /&gt;
        exit(1);&lt;br /&gt;
      }&lt;br /&gt;
      return a[i];&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  MyType&amp;lt;int, 10&amp;gt; intob;&lt;br /&gt;
  MyType&amp;lt;double, 15&amp;gt; doubleob;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;Integer array: &amp;quot;;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     intob[i] = i;&lt;br /&gt;
  for(int i=0; i&amp;lt;10; i++)&lt;br /&gt;
     cout &amp;lt;&amp;lt; intob[i] &amp;lt;&amp;lt; &amp;quot;  &amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;Double array: &amp;quot;;&lt;br /&gt;
  for(int i=0; i&amp;lt;15; i++)&lt;br /&gt;
     doubleob[i] = (double) i/3;&lt;br /&gt;
  for(int i=0; i&amp;lt;15; i++)&lt;br /&gt;
     cout &amp;lt;&amp;lt; doubleob[i] &amp;lt;&amp;lt; &amp;quot;  &amp;quot;;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  intob[12] = 100; // generates runtime error&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Integer array: 0  1  2  3  4  5  6  7  8  9&lt;br /&gt;
Double array: 0  0.333333  0.666667  1  1.33333  1.66667  2  2.33333  2.66667  3  3.33333  3.66667  4  4.33333  4.66667&lt;br /&gt;
Index value of 12 is out-of-bounds.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loop with generic parameter==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
template &amp;lt;typename T&amp;gt;&lt;br /&gt;
inline T dot_product (int dim, T* a, T* b)&lt;br /&gt;
{&lt;br /&gt;
    T result = T();&lt;br /&gt;
    for (int i=0; i&amp;lt;dim; ++i) {&lt;br /&gt;
        result += a[i]*b[i];&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int a[3] = { 1, 2, 3};&lt;br /&gt;
    int b[3] = { 5, 6, 7};&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;dot_product(3,a,b) = &amp;quot; &amp;lt;&amp;lt; dot_product(3,a,b)&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;dot_product(3,a,a) = &amp;quot; &amp;lt;&amp;lt; dot_product(3,a,a)&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;dot_product(3,a,b) = 38&lt;br /&gt;
dot_product(3,a,a) = 14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nested template type==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;deque&amp;gt;&lt;br /&gt;
#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;
#include &amp;lt;memory&amp;gt;&lt;br /&gt;
template &amp;lt;typename T,&lt;br /&gt;
          template &amp;lt;typename ELEM, &lt;br /&gt;
                    typename = std::allocator&amp;lt;ELEM&amp;gt; &amp;gt;&lt;br /&gt;
                    class CONT = std::deque&amp;gt;&lt;br /&gt;
class Stack {&lt;br /&gt;
  private:&lt;br /&gt;
    CONT&amp;lt;T&amp;gt; elems;         // elements&lt;br /&gt;
  public:&lt;br /&gt;
    void push(T const&amp;amp;);   // push element&lt;br /&gt;
    void pop();            // pop element&lt;br /&gt;
    T top() const;         // return top element&lt;br /&gt;
    bool empty() const {   // return whether the stack is empty&lt;br /&gt;
        return elems.empty();&lt;br /&gt;
    }&lt;br /&gt;
    // assign stack of elements of type T2&lt;br /&gt;
    template&amp;lt;typename T2, &lt;br /&gt;
             template&amp;lt;typename ELEM2, &lt;br /&gt;
                      typename = std::allocator&amp;lt;ELEM2&amp;gt;&lt;br /&gt;
                     &amp;gt;class CONT2&amp;gt;&lt;br /&gt;
    Stack&amp;lt;T,CONT&amp;gt;&amp;amp; operator= (Stack&amp;lt;T2,CONT2&amp;gt; const&amp;amp;);&lt;br /&gt;
};&lt;br /&gt;
template &amp;lt;typename T, template &amp;lt;typename,typename&amp;gt; class CONT&amp;gt;&lt;br /&gt;
void Stack&amp;lt;T,CONT&amp;gt;::push (T const&amp;amp; elem)&lt;br /&gt;
{&lt;br /&gt;
    elems.push_back(elem);    // append copy of passed elem&lt;br /&gt;
}&lt;br /&gt;
template&amp;lt;typename T, template &amp;lt;typename,typename&amp;gt; class CONT&amp;gt;&lt;br /&gt;
void Stack&amp;lt;T,CONT&amp;gt;::pop ()&lt;br /&gt;
{&lt;br /&gt;
    if (elems.empty()) {&lt;br /&gt;
        throw std::out_of_range(&amp;quot;Stack&amp;lt;&amp;gt;::pop(): empty stack&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    elems.pop_back();         // remove last element&lt;br /&gt;
}&lt;br /&gt;
template &amp;lt;typename T, template &amp;lt;typename,typename&amp;gt; class CONT&amp;gt;&lt;br /&gt;
T Stack&amp;lt;T,CONT&amp;gt;::top () const&lt;br /&gt;
{&lt;br /&gt;
    if (elems.empty()) {&lt;br /&gt;
        throw std::out_of_range(&amp;quot;Stack&amp;lt;&amp;gt;::top(): empty stack&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    return elems.back();      // return copy of last element&lt;br /&gt;
}&lt;br /&gt;
template &amp;lt;typename T, template &amp;lt;typename,typename&amp;gt; class CONT&amp;gt;&lt;br /&gt;
 template &amp;lt;typename T2, template &amp;lt;typename,typename&amp;gt; class CONT2&amp;gt;&lt;br /&gt;
Stack&amp;lt;T,CONT&amp;gt;&amp;amp;&lt;br /&gt;
Stack&amp;lt;T,CONT&amp;gt;::operator= (Stack&amp;lt;T2,CONT2&amp;gt; const&amp;amp; op2)&lt;br /&gt;
{&lt;br /&gt;
    if ((void*)this == (void*)&amp;amp;op2) {    // assignment to itself?&lt;br /&gt;
        return *this;&lt;br /&gt;
    }&lt;br /&gt;
    Stack&amp;lt;T2,CONT2&amp;gt; tmp(op2);        // create a copy of the assigned stack&lt;br /&gt;
    elems.clear();                   // remove existing elements&lt;br /&gt;
    while (!tmp.empty()) {           // copy all elements&lt;br /&gt;
        elems.push_front(tmp.top());&lt;br /&gt;
        tmp.pop();&lt;br /&gt;
    }&lt;br /&gt;
    return *this;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    try {&lt;br /&gt;
        Stack&amp;lt;int&amp;gt;   intStack;       // stack of ints&lt;br /&gt;
        Stack&amp;lt;float&amp;gt; floatStack;     // stack of floats&lt;br /&gt;
        // manipulate int stack&lt;br /&gt;
        intStack.push(42);&lt;br /&gt;
        intStack.push(7);&lt;br /&gt;
        // manipulate float stack&lt;br /&gt;
        floatStack.push(7.7);&lt;br /&gt;
        // assign stacks of different type&lt;br /&gt;
        floatStack = intStack;&lt;br /&gt;
        // print float stack&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; floatStack.top() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        floatStack.pop();&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; floatStack.top() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        floatStack.pop();&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; floatStack.top() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
        floatStack.pop();&lt;br /&gt;
    }&lt;br /&gt;
    catch (std::exception const&amp;amp; ex) {&lt;br /&gt;
        std::cerr &amp;lt;&amp;lt; &amp;quot;Exception: &amp;quot; &amp;lt;&amp;lt; ex.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
    // stack for ints using a vector as an internal container&lt;br /&gt;
    Stack&amp;lt;int,std::vector&amp;gt; vStack;&lt;br /&gt;
    //...&lt;br /&gt;
    vStack.push(42);&lt;br /&gt;
    vStack.push(7);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; vStack.top() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    vStack.pop();&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;7&lt;br /&gt;
42&lt;br /&gt;
Exception: Stack&amp;lt;&amp;gt;::top(): empty stack&lt;br /&gt;
7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==primary template to compute sqrt(N) via iteration and partial specialization to end the iteration==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// primary template to compute sqrt(N) via iteration&lt;br /&gt;
template &amp;lt;int N, int I=1&amp;gt;&lt;br /&gt;
class Sqrt {&lt;br /&gt;
  public:&lt;br /&gt;
    enum { result = (I*I&amp;lt;N) ? Sqrt&amp;lt;N,I+1&amp;gt;::result&lt;br /&gt;
                            : I };&lt;br /&gt;
};&lt;br /&gt;
// partial specialization to end the iteration&lt;br /&gt;
template&amp;lt;int N&amp;gt;&lt;br /&gt;
class Sqrt&amp;lt;N,N&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    enum { result = N };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;16&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;16&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;25&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;25&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;42&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;42&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;1&amp;gt;::result =  &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;1&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Sqrt&amp;lt;16&amp;gt;::result = 4&lt;br /&gt;
Sqrt&amp;lt;25&amp;gt;::result = 5&lt;br /&gt;
Sqrt&amp;lt;42&amp;gt;::result = 7&lt;br /&gt;
Sqrt&amp;lt;1&amp;gt;::result =  1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==primary template: yield second or third argument depending on first argument==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// primary template: yield second or third argument depending on first argument&lt;br /&gt;
template&amp;lt;bool C, typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse;&lt;br /&gt;
// partial specialization: true yields second argument&lt;br /&gt;
template&amp;lt;typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse&amp;lt;true, Ta, Tb&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    typedef Ta ResultT;&lt;br /&gt;
};&lt;br /&gt;
// partial specialization: false yields third argument&lt;br /&gt;
template&amp;lt;typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse&amp;lt;false, Ta, Tb&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    typedef Tb ResultT;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// primary template for main recursive step&lt;br /&gt;
template&amp;lt;int N, int LO=1, int HI=N&amp;gt;&lt;br /&gt;
class Sqrt {&lt;br /&gt;
  public:&lt;br /&gt;
    // compute the midpoint, rounded up&lt;br /&gt;
    enum { mid = (LO+HI+1)/2 };&lt;br /&gt;
    // search a not too large value in a halved interval&lt;br /&gt;
    typedef typename IfThenElse&amp;lt;(N&amp;lt;mid*mid),&lt;br /&gt;
                                Sqrt&amp;lt;N,LO,mid-1&amp;gt;,&lt;br /&gt;
                                Sqrt&amp;lt;N,mid,HI&amp;gt; &amp;gt;::ResultT&lt;br /&gt;
            SubT;&lt;br /&gt;
    enum { result = SubT::result };&lt;br /&gt;
};&lt;br /&gt;
// partial specialization for end of recursion criterion&lt;br /&gt;
template&amp;lt;int N, int S&amp;gt;&lt;br /&gt;
class Sqrt&amp;lt;N, S, S&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    enum { result = S };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;16&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;16&amp;gt;::result&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;25&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;25&amp;gt;::result&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;42&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;42&amp;gt;::result&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;1&amp;gt;::result =  &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;1&amp;gt;::result&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Sqrt&amp;lt;16&amp;gt;::result = 4&lt;br /&gt;
Sqrt&amp;lt;25&amp;gt;::result = 5&lt;br /&gt;
Sqrt&amp;lt;42&amp;gt;::result = 6&lt;br /&gt;
Sqrt&amp;lt;1&amp;gt;::result =  1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sqrt: primary template: yield second or third argument depending on first argument==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// primary template: yield second or third argument depending on first argument&lt;br /&gt;
template&amp;lt;bool C, typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse;&lt;br /&gt;
// partial specialization: true yields second argument&lt;br /&gt;
template&amp;lt;typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse&amp;lt;true, Ta, Tb&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    typedef Ta ResultT;&lt;br /&gt;
};&lt;br /&gt;
// partial specialization: false yields third argument&lt;br /&gt;
template&amp;lt;typename Ta, typename Tb&amp;gt;&lt;br /&gt;
class IfThenElse&amp;lt;false, Ta, Tb&amp;gt; {&lt;br /&gt;
  public:&lt;br /&gt;
    typedef Tb ResultT;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// template to yield template argument as result&lt;br /&gt;
template&amp;lt;int N&amp;gt;&lt;br /&gt;
class Value {&lt;br /&gt;
  public:&lt;br /&gt;
    enum { result = N };&lt;br /&gt;
};&lt;br /&gt;
// template to compute sqrt(N) via iteration&lt;br /&gt;
template &amp;lt;int N, int I=1&amp;gt;&lt;br /&gt;
class Sqrt {&lt;br /&gt;
  public:&lt;br /&gt;
    // instantiate next step or result type as branch&lt;br /&gt;
    typedef typename IfThenElse&amp;lt;(I*I&amp;lt;N),&lt;br /&gt;
                                Sqrt&amp;lt;N,I+1&amp;gt;,&lt;br /&gt;
                                Value&amp;lt;I&amp;gt;&lt;br /&gt;
                               &amp;gt;::ResultT&lt;br /&gt;
            SubT;&lt;br /&gt;
    // use the result of branch type&lt;br /&gt;
    enum { result = SubT::result };&lt;br /&gt;
};&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;16&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;16&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;25&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;25&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;42&amp;gt;::result = &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;42&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Sqrt&amp;lt;1&amp;gt;::result =  &amp;quot; &amp;lt;&amp;lt; Sqrt&amp;lt;1&amp;gt;::result &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;Sqrt&amp;lt;16&amp;gt;::result = 4&lt;br /&gt;
Sqrt&amp;lt;25&amp;gt;::result = 5&lt;br /&gt;
Sqrt&amp;lt;42&amp;gt;::result = 7&lt;br /&gt;
Sqrt&amp;lt;1&amp;gt;::result =  1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==template function for generic parameter and pointer to generic parameter==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;/* The following code example is taken from the book&lt;br /&gt;
 * &amp;quot;C++ Templates - The Complete Guide&amp;quot;&lt;br /&gt;
 * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002&lt;br /&gt;
 *&lt;br /&gt;
 * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.&lt;br /&gt;
 * Permission to copy, use, modify, sell and distribute this software&lt;br /&gt;
 * is granted provided this copyright notice appears in all copies.&lt;br /&gt;
 * This software is provided &amp;quot;as is&amp;quot; without express or implied&lt;br /&gt;
 * warranty, and with no claim as to its suitability for any purpose.&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
int f(T)&lt;br /&gt;
{&lt;br /&gt;
    return 1;&lt;br /&gt;
}&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
int f(T*)&lt;br /&gt;
{&lt;br /&gt;
    return 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; f&amp;lt;int*&amp;gt;((int*)0) &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; f&amp;lt;int&amp;gt;((int*)0)  &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;1&lt;br /&gt;
2&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Use template parameter as constructor parameter==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
class Rect&lt;br /&gt;
{  &lt;br /&gt;
       T x1,x2,y1,y2;&lt;br /&gt;
public:&lt;br /&gt;
    Rect(T a,T b,T c,T d)  {&lt;br /&gt;
        x1=a;&lt;br /&gt;
        y1=b;&lt;br /&gt;
        x2=c;&lt;br /&gt;
        y2=d;&lt;br /&gt;
    }&lt;br /&gt;
    T Area();&lt;br /&gt;
    T Distance();&lt;br /&gt;
};&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T Rect&amp;lt;T&amp;gt;::Area()&lt;br /&gt;
{      return (x1-x2)*(y1-y2);}&lt;br /&gt;
template &amp;lt;class T&amp;gt;&lt;br /&gt;
T Rect&amp;lt;T&amp;gt;::Distance(){ &lt;br /&gt;
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));&lt;br /&gt;
}&lt;br /&gt;
main()&lt;br /&gt;
{&lt;br /&gt;
   Rect&amp;lt;int&amp;gt; p1(2.5,3.5,5.5,7);&lt;br /&gt;
   cout &amp;lt;&amp;lt;p1.Area()&amp;lt;&amp;lt;endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt;p1.Distance()&amp;lt;&amp;lt;endl;&lt;br /&gt;
   Rect &amp;lt;float&amp;gt; p2(2.5,3.5,5.5,7.0);&lt;br /&gt;
   cout &amp;lt;&amp;lt;p2.Area()&amp;lt;&amp;lt;endl;&lt;br /&gt;
   cout &amp;lt;&amp;lt;p2.Distance()&amp;lt;&amp;lt;endl;&lt;br /&gt;
   return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre class=codeResult&amp;gt;12&lt;br /&gt;
5&lt;br /&gt;
10.5&lt;br /&gt;
4.60977&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>