C++ Tutorial/template/Template specialization — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
|
(нет различий)
|
Версия 14:21, 25 мая 2010
Partial specialization as end criteria
/* The following code example is taken from the book
* "C++ Templates - The Complete Guide"
* by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002
*
* (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
// primary template
template <int DIM, typename T>
class DotProduct {
public:
static T result (T* a, T* b) {
return *a * *b + DotProduct<DIM-1,T>::result(a+1,b+1);
}
};
// partial specialization as end criteria
template <typename T>
class DotProduct<1,T> {
public:
static T result (T* a, T* b) {
return *a * *b;
}
};
// convenience function
template <int DIM, typename T>
inline T dot_product (T* a, T* b)
{
return DotProduct<DIM,T>::result(a,b);
}
int main()
{
int a[3] = { 1, 2, 3};
int b[3] = { 5, 6, 7};
<< "\n";
<< "\n";
}
dot_product<3>(a,b) = 38 dot_product<3>(a,a) = 14
Primary template to compute 3 to the Nth and full specialization to end the recursion
/* The following code example is taken from the book
* "C++ Templates - The Complete Guide"
* by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002
*
* (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>
// primary template to compute 3 to the Nth
template<int N>
class Pow3 {
public:
enum { result = 3 * Pow3<N-1>::result };
};
// full specialization to end the recursion
template<>
class Pow3<0> {
public:
enum { result = 1 };
};
int main()
{
std::cout << "Pow3<7>::result = " << Pow3<7>::result
<< "\n";
}
Pow3<7>::result = 2187
Template specialization
#include <iostream.h>
template <class T>
class MyClass {
T value1, value2;
public:
MyClass (T first, T second)
{value1=first; value2=second;}
T module () {return 0;}
};
template <>
class MyClass <int> {
int value1, value2;
public:
MyClass (int first, int second){
value1 = first;
value2 = second;
}
int module (){
return value1value2;
}
};
int main () {
MyClass <int> myints (100,75);
MyClass <float> myfloats (100.0,75.0);
cout << myints.module() << "\n";
cout << myfloats.module() << "\n";
return 0;
}
25 0