C++ Tutorial/template/overload template function

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Overload generic method and non-generic method

<source lang="cpp">#include<iostream.h>

  1. include<string.h>

template<class T> T min(T a,T b) {

   cout << "generic";
      return (a<b?a:b);

} char *min(char *a,char *b) {

   cout << "not generic";
      return (strcmp(a,b)<0?a:b);

} int main() {

 double a=3.56,b=8.23;
 char s1[]="Hello",s2[]="Good";
 cout<<min(a,b)<<endl;
 cout<<min(s1,s2)<<endl;

}</source>

generic3.56
not genericGood

Using an overloaded function template

<source lang="cpp">#include <iostream> using std::cout; using std::endl; template<class T> T larger(T a, T b); long* larger(long* a, long* b); template <class T> T larger (const T array[], int count); // Overloaded templat e prototype int main() {

 cout << "Larger of 1.5 and 2.5 is " << larger(1.5, 2.5) << endl;
 cout << "Larger of 3.5 and 4.5 is " << larger(3.5, 4.5) << endl;

 int a_int = 35;
 int b_int = 45;
 cout << larger(a_int, b_int)<< endl;
 
 long a_long = 9;
 long b_long = 8;
 cout << larger(a_long, b_long)<< endl;
 cout << *larger(&a_long,&b_long)<< endl;
 double x[] = { 10.5, 12.5, 2.5, 13.5, 5.5 };
 cout << larger(x, sizeof x/sizeof x[0]) << endl;

return 0; } template <class T> T larger(T a, T b) {

 cout << "standard version " << endl;
 return a>b ? a : b;

} long* larger(long* a, long* b) {

 cout << "overloaded version for long* " << endl;
 return *a>*b ? a : b;

} template <class T> T larger (const T array[], int count) {

 cout << "template overload version for arrays " << endl;
 T result = array[0];
 for(int i = 1 ; i < count ; i++)
   if(array[i] > result)
     result = array[i];
 return result;

}</source>

standard version
Larger of 1.5 and 2.5 is 2.5
standard version
Larger of 3.5 and 4.5 is 4.5
standard version
45
standard version
9
overloaded version for long*
9
template overload version for arrays
13.5

Using function template specialization

<source lang="cpp">#include <iostream> using std::cout; using std::endl; template<class T> T larger(T a, T b); // Function template prototyp e template<> long* larger<long*>(long* a, long* b); // Specialization int main() {

 cout << "Larger of 1.5 and 2.5 is " << larger(1.5, 2.5) << endl;
 cout << "Larger of 3.5 and 4.5 is " << larger(3.5, 4.5) << endl;

 int a_int = 35;
 int b_int = 45;
 cout << larger(a_int, b_int)<< endl;

 long a_long = 9;
 long b_long = 8;
 cout << larger(a_long, b_long)<< endl;
 cout << *larger(&a_long,&b_long)<< endl;

return 0; } template <class T> T larger(T a, T b) {

 cout << "standard version " << endl;
 return a>b ? a : b;

} template <> long* larger<long*>(long* a, long* b) {

 cout << "specialized version " << endl;
 return *a>*b ? a : b;

}</source>

standard version
Larger of 1.5 and 2.5 is 2.5
standard version
Larger of 3.5 and 4.5 is 4.5
standard version
45
standard version
9
specialized version
9