Professional Documents
Culture Documents
Templates
?template
:swap '
void swap(int &v1, int &v2) {
int t = v1;
v1 = v2;
v2 = t;
}
?? double sawp
void swap(double &v1, double &v2) {
double t = v1;
v1 = v2;
v2 = t;
}
?template
(
)?
:
>template<class T
{ )void swap (T &v1, T &v2
;T t = v1
;v1 = v2
;v2 = t
LL = Linked List
:LL
LL int
LL double
C++- :
LL
Node LL-
Node-
?
:
Integer : public Node
Double : public Node
Node
Integer
Double
?
( )int, double
( LL - )
:
heap-
stack
' Node-
template
(
hiding ,RTTI-')
,Node , '
:casting-
template
: .
exe-
:
, >LL<int
LL-
: / ."
( template- )
, :LL ,
, ..
:)C (4
void printChar (char i)
{cout << i <<endl;}
void printInt (int i)
{cout << i <<endl;}
void printDouble (double i) {cout << i <<endl;}
void printString (string i) {cout << i <<endl;}
,
:)C++ (function overloading-
void print (char i) { cout << i << endl; }
void print (int i)
{ cout << i << endl; }
void print (double i) { cout << i << endl; }
void print (string i) { cout << i << endl; }
:template '
template <typename T>
void print (T i) {
cout << i << endl;
}
main
print(2);
print(2.2);
print("6.6");
* - RTTI
*
template <typename T>
void print (T i) {
cout << typeid(T).name() << i << endl;
}
Main Implicit:
print(49);
print(2.2);
print("6.6");
Output:
int 49
double 2.2
char const * 6.6
Main Explicit:
print<char>(49);
print<long>(2.2);
print<void *>("6.6");
Output:
char 1
long 2
void * 00117800
template<class T>
void swap (T &v1, T &v2) {
T t = v1;
v1 = v2;
v2 = t;
}
template< typename U>
void swap (U &u1, U &u2) {
U u = u1;
u1 = u2;
u2 = u;
?
Compilation Error:
error C2995:
'void swap (T &,T &)'
: function template
has already been
defined
Class Template
Class template-
:
A1<double> d(5.5);
: ,
class A1<double> {
private: double _val;
public:
A1(double val) : _val(val) {}
double getVal() { return _val; }
};
:
A1<int> i(3);
: ,
class A1<int> {
private: int _val;
public:
A1(int val) : _val(val) {}
int getVal() { return _val; }
};
default type
template <typename T1,
typename T2=float,
int i=1o>
class AClass { }
AClass<int, double, 100> c1;
AClass<double, string> c2;
AClass<long> c3;
AClass<double, float, 5> c4;
type-
AClass<int, 7>
c1; c1.foo(); // 7
AClass<char, 'x'> c2; c2.foo(); // x
AClass<char, 49.2> c3; c3.foo(); // 1
type
>template <typename T
)void foo1(LinkedList<T*> ll
}{...
foo1 T-
>template <typename T
)void foo2(LinkedList<LinkedList<T>* > list
}{...
foo2
T
?member '
// compilation OK
// compilation OK
// Compilation Error:
// Member function
// is instantiated only if called
Template Specialization
// General Template
template <class T>
class AClass{
public:
void print(T &p)
{cout<<"G- "<< p; }
};
AClass<double> e;
double d = 2.2;
e.print(d);
// output: G- 2.2
// Specialization Class
template <>
class AClass <char> {
public:
void print(char &p)
{cout<<"S- "<<p-'A'; }
};
AClass<char> a;
char c = 'C';
a.print(c);
// output: S- 2
Template Specialization
// General Template
template <class T> bool less (const T &t1, const T &t2)
{cout<< "in #1\n"; return t1<t2;}
// Specialization Class
template <> bool less <const char*> (const char* s1,
const char* s2)
{ cout<< "in #2\n"; return strcmp(s1, s2)<0; }
less (1, 2) ;
less (101.2, 23.2);
less ("C++", "Java");
less ('C', 4);
in #1: 1
in #1: 0
in #2: 1
Compilation Error
Template Specialization
// More General Template
template <class T, class U> bool less (T t1, U u2)
{cout<< "in #0\n";return t1<u2;}
// General Template
template <class T> bool less (T t1, T t2)
{cout<< "in #1\n"; return t1<t2;}
// Specialization Class
template <> bool less <const char*> (const char* s1,
const char* s2)
{ cout<< "in #2\n"; return strcmp(s1, s2)<0; }
#0: 0
Template Specialization
- VC++
:g++
Specialization' ( class
') VC- g++-
:
Template +
' " Template"
inline' specialization-
template <>
class Power2<0> {
public:
enum { val = 1 };
};
Main:
// == 2^3 = 8
Power2<3>::val;
// == 2^0 = 1
Power2<0>::val;
// == 2^-1 = ???
Power2<-1>::val;
-Template
"" , ==
!= :
-Template
"" , <
=> ,=< ,< :
-Template
" template-
:
... ,int, double, object :
- " template-
: ,-
... ,int, double, object :
STL ..
()Standard Template Library