class="post" style="border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-top-
color: rgb(189, 205, 238); border-right-
color: rgb(189, 205, 238); border-bottom-
color: rgb(189, 205, 238); border-left-
color: rgb(189, 205, 238); ba
ckground-
color: white; padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px;
color: rgb(75, 75, 75); ">
这里用一个简单的例子来说明这三种情况:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> general version
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); "> lh
color: rgb(0, 0, 0); ">==
color: rgb(0, 0, 0); "> rh;
}
};
这是一个用于比较的类模板c;里面可以有多种用于比较的函数c; 以IsEqual为例。
一、特化为绝对类型
也就是说直接为某个特定类型做特化c;这是我们最常见的一种特化方式c; 如特化为float, double等
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for float
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); "> abs(lh
color: rgb(0, 0, 0); ">-
color: rgb(0, 0, 0); "> rh)
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); "> 10e
color: rgb(0, 0, 0); ">-
color: rgb(0, 0, 0); ">3
color: rgb(0, 0, 0); ">;
}
};
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for double
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); "> abs(lh
color: rgb(0, 0, 0); ">-
color: rgb(0, 0, 0); "> rh)
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); "> 10e
color: rgb(0, 0, 0); ">-
color: rgb(0, 0, 0); ">6
color: rgb(0, 0, 0); ">;
}
};
二、特化为引用c;指针类型
这种特化我最初是在stl源码的的class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_traits特化中发现的c; 如下:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> _Iterator
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">struct
color: rgb(0, 0, 0); "> class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_traits {
typedef typename _Iterator::class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_category class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_category;
typedef typename _Iterator::value_type value_type;
typedef typename _Iterator::difference_type difference_type;
typedef typename _Iterator::pointer pointer;
typedef typename _Iterator::reference reference;
};
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for _Tp*
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> _Tp
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">struct
color: rgb(0, 0, 0); "> class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_traits
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">_Tp
color: rgb(0, 0, 0); ">*>
color: rgb(0, 0, 0); "> {
typedef random_class="tags" href="/tags/ACCESS.html" title=access>access_class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_tag class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> pointer;
typedef _Tp
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> reference;
};
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for const _Tp*
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> _Tp
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">struct
color: rgb(0, 0, 0); "> class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_traits
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> _Tp
color: rgb(0, 0, 0); ">*>
color: rgb(0, 0, 0); "> {
typedef random_class="tags" href="/tags/ACCESS.html" title=access>access_class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_tag class="tags" href="/tags/ITERATOR.html" title=iterator>iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> _Tp
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> pointer;
typedef
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> _Tp
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); "> reference;
};
当然c;除了T*, 我们也可以将T特化为 const T*, T&, const T&等c;以下还是以T*为例:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for T*
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">*>
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); ">lh,
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); ">rh);
}
};
这种特化其实是就不是一种绝对的特化c; 它只是对类型做了某些限定c;但仍然保留了其一定的模板性c;这种特化给我们提供了极大的方便c; 如这里c; 我们就不需要对int*, float*, double*等等类型分别做特化了。
三、特化为另外一个类模板
这其实是第二种方式的扩展c;其实也是对类型做了某种限定c;而不是绝对化为某个具体类型c;如下:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for vector<T>
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>&
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>&
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">if
color: rgb(0, 0, 0); ">(lh.size()
color: rgb(0, 0, 0); ">!=
color: rgb(0, 0, 0); "> rh.size())
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">false
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">else
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">for
color: rgb(0, 0, 0); ">(
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); "> i
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">0
color: rgb(0, 0, 0); ">; i
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); "> lh.size();
color: rgb(0, 0, 0); ">++
color: rgb(0, 0, 0); ">i)
{
color: rgb(0, 0, 255); ">if
color: rgb(0, 0, 0); ">(lh[i]
color: rgb(0, 0, 0); ">!=
color: rgb(0, 0, 0); "> rh[i])
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">false
color: rgb(0, 0, 0); ">;
}
}
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">true
color: rgb(0, 0, 0); ">;
}
};
这就把IsEqual的参数限定为一种vector类型c; 但具体是vector<int>还是vector<float>c; 我们可以不关心c; 因为对于这两种类型c;我们的处理方式是一样的c;我们可以把这种方式称为“半特化”。
当然c; 我们可以将其“半特化”为任何我们自定义的模板类类型:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> specialize for any template class type
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> T1
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">struct
color: rgb(0, 0, 0); "> SpecializedType
{
T1 x1;
T1 x2;
};
template
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">class
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
{
color: rgb(0, 0, 255); ">public
color: rgb(0, 0, 0); ">:
color: rgb(0, 0, 255); ">static
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> IsEqual(
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>&
color: rgb(0, 0, 0); "> lh,
color: rgb(0, 0, 255); ">const
color: rgb(0, 0, 0); "> SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>&
color: rgb(0, 0, 0); "> rh)
{
color: rgb(0, 0, 255); ">return
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">T
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(lh.x1
color: rgb(0, 0, 0); ">+
color: rgb(0, 0, 0); "> lh.x2, rh.x1
color: rgb(0, 0, 0); ">+
color: rgb(0, 0, 0); "> rh.x2);
}
};
这就是三种类型的模板特化c; 我们可以这么使用这个Compare类:
color: rgb(204, 204, 204); border-right-
color: rgb(204, 204, 204); border-bottom-
color: rgb(204, 204, 204); border-left-
color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; font-size: 13px; width: 98%; ba
ckground-
color: rgb(238, 238, 238); ">
color: rgb(0, 0, 0); ">
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> int
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); "> i1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); "> i2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(i1, i2);
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> float
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); "> f1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); "> f2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(f1, f2);
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> double
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); "> d1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); "> d2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">10
color: rgb(0, 0, 0); ">;
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r3
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">double
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(d1, d2);
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> pointer
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> p1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); ">i1;
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">*
color: rgb(0, 0, 0); "> p2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">&
color: rgb(0, 0, 0); ">i2;
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r4
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">*>
color: rgb(0, 0, 0); ">::IsEqual(p1, p2);
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> vector<T>
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); "> vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); "> v1;
v1.push_back(
color: rgb(0, 0, 0); ">1
color: rgb(0, 0, 0); ">);
v1.push_back(
color: rgb(0, 0, 0); ">2
color: rgb(0, 0, 0); ">);
vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); "> v2;
v2.push_back(
color: rgb(0, 0, 0); ">1
color: rgb(0, 0, 0); ">);
v2.push_back(
color: rgb(0, 0, 0); ">2
color: rgb(0, 0, 0); ">);
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r5
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">vector
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">int
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(v1, v2);
color: rgb(0, 128, 0); ">//
color: rgb(0, 128, 0); "> custom template class
color: rgb(0, 128, 0); ">
color: rgb(0, 0, 0); "> SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); "> s1
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> {
color: rgb(0, 0, 0); ">10.1f
color: rgb(0, 0, 0); ">,
color: rgb(0, 0, 0); ">10.2f
color: rgb(0, 0, 0); ">};
SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); "> s2
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> {
color: rgb(0, 0, 0); ">10.3f
color: rgb(0, 0, 0); ">,
color: rgb(0, 0, 0); ">10.0f
color: rgb(0, 0, 0); ">};
color: rgb(0, 0, 255); ">bool
color: rgb(0, 0, 0); "> r6
color: rgb(0, 0, 0); ">=
color: rgb(0, 0, 0); "> Compare
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 0); ">SpecializedType
color: rgb(0, 0, 0); "><
color: rgb(0, 0, 255); ">float
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">
color: rgb(0, 0, 0); ">>
color: rgb(0, 0, 0); ">::IsEqual(s1, s2);
注:感谢longshanks对于本文中"类模板"与"模板类"概念的澄清
c;已更正 (2007-7-16)