- :
template < typename T >
T add(T a, T b)
{
return a + b;
}
abs , T. , , . . , , - , T :
int main ()
{
int x = add(2, 3); // : add< int >
double y = add(2.5, 3.5); // : add< double >
double z = add(2, 2.5); //
}
error C2782: 'T add(T,T)': template parameter 'T' is ambiguous
see declaration of 'add'
could be 'double'
or 'int'
:
double z1 = add< int >(2, 2.5); // : add< int >, 2-
double z2 = add< double >(2, 2.5); // : add< double >
double z3 = add((double) 2, 2.5); // : add< double >
double z4 = add(2, (int) 2.5); // : add< int >
, . :
template < typename RT, typename T1, typename T2 >
RT add (T1 a, T2 b)
{
return a + b;
}
:
short x = 20000;
int result = add< int, char, short >(a, x);
:
short x = 20000;
int result = add< int >(a, x);
++11 . - decltype. , . :
decltype (2.5) x;
x double. . , , . decltype :
template < typename T1, typename T2 >
decltype (T1() + T2()) add (T1 a, T2 b)
{
return a + b;
}
:
decltype (T1() + T2())
|
|
( !) T1 T2. , . . , decltype , . , add . , :
short x = 20000;
int result = add(a, x);
decltype , . , ++14 , , decltype , :
template < typename T1, typename T2 >
auto add (T1 a, T2 b) -> decltype (T1() + T2())
{
return a + b;
}
- . .
, -. . , template < typename T> . .
, , . , . , , . , , - !
#include <iostream>
template < typename T>
class Test
{
public:
void f (T x)
{
// -, , T !
* x = 5;
}
void g ()
{
std::cout << "Saying hello!" << std::endl;
}
};
int main ()
{
// int.
// int, f, ,
// , f!
Test< int > t;
t.g();
}
- . , Test<int> Test<short> - , .
, . , , . - Test<int> Test<short>, , :
|
|
#include <iostream>
template < typename T >
class Test
{
public:
static int ms_objectCounter;
public:
Test () { ++ ms_objectCounter; }
Test (const Test< T > & _t) { ++ ms_objectCounter; }
};
int Test< int >::ms_objectCounter;
int Test< short >::ms_objectCounter;
int main ()
{
Test< int > ti1;
Test< int > ti2 = ti1;
std::cout << Test< int >::ms_objectCounter << std::endl;
std::cout << Test< short >::ms_objectCounter << std::endl;
}
, - :
template < typename T = int >
class Test
{
//...
};
++11 , . .
- . :
1. . , , , :
//
Stack (int _size = 10);
, :
//
Stack< T > & operator = (const Stack< T >& _s);
2. , , . , :
template < typename T >
Stack< T >::Stack (int _size)
: m_size(_size)
{
m_pData = new T[ m_size ];
m_pTop = m_pData;
}
3. . , (inline). CPP- - . . , C++, . , .
4. , . - ? , (, char) :
void push (const T& _value);
stack.hpp
#ifndef _STACK_HPP_
#define _STACK_HPP_
#include <stdexcept>
#include <initializer_list>
//*****************************************************************************
template < typename T >
class Stack
{
/*-----------------------------------------------------------------*/
public:
/*-----------------------------------------------------------------*/
//
Stack (int _size = 10);
//
Stack (std::initializer_list< T > _l);
|
|
//
Stack (const Stack< T > & _s);
//
Stack (Stack< T > && _s);
//
~Stack ();
//
Stack< T > & operator = (const Stack< T >& _s);
//
Stack< T > & operator = (Stack< T > && _s);
//
void push (const T& _value);
//
void pop ();
//
T & top () const;
//
bool isEmpty () const;
//
bool isFull () const;
/*-----------------------------------------------------------------*/
private:
/*-----------------------------------------------------------------*/
//
int m_size;
//
T* m_pData;
//
T* m_pTop;
/*-----------------------------------------------------------------*/
};
//*****************************************************************************
//
template < typename T >
Stack< T >::Stack (int _size)
: m_size(_size)
{
//
if (m_size <= 0)
throw std::logic_error("Non-positive size");
//
m_pData = new T[ m_size ];
//
m_pTop = m_pData;
}
//*****************************************************************************
//
template < typename T >
Stack< T >::Stack (std::initializer_list< T > _l)
: Stack(_l.size())
{
//
for (const T & x: _l)
push(x);
}
//*****************************************************************************
//
template < typename T >
Stack< T >::Stack (const Stack< T >& _s)
: m_size(_s.m_size)
{
//
m_pData = new T[ m_size ];
m_pTop = m_pData;
//
int nActual = _s.m_pTop - _s.m_pData;
for (int i = 0; i < nActual; i++)
push(_s.m_pData[ i ]);
}
//*****************************************************************************
//
template < typename T >
Stack< T >::Stack (Stack< T > && _s)
: m_size(_s.m_size),
m_pData(_s.m_pData),
m_pTop(_s.m_pTop)
{
//
_s.m_pData = _s.m_pTop = nullptr;
}
//*****************************************************************************
//
template < typename T >
Stack< T >::~Stack ()
{
delete[] m_pData;
}
//*****************************************************************************
//
template < typename T >
Stack< T >& Stack< T >:: operator = (const Stack< T >& _s)
{
//
if (this == & _s)
return * this;
//
|
|
delete[] m_pData;
m_size = _s.m_size;
m_pData = new T[ m_size ];
//
int nActual = _s.m_pTop - _s.m_pData;
for (int i = 0; i < nActual; i++)
m_pData[ i ] = _s.m_pData[ i ];
//
m_pTop = m_pData + nActual;
//
return * this;
}
//*****************************************************************************
//
template < typename T >
Stack< T >& Stack< T >:: operator = (Stack< T > && _s)
{
//
if (this == & _s)
return * this;
//
delete[] m_pData;
//
m_size = _s.m_size;
m_pData = _s.m_pData;
m_pTop = _s.m_pTop;
//
_s.m_pData = _s.m_pTop = nullptr;
//
return * this;
}
//*****************************************************************************
//
template < typename T>
void Stack< T >::push (const T& _value)
{
// 100%
if (isFull())
throw std::logic_error("Stack overflow error");
// -
* m_pTop++ = _value;
}
//*****************************************************************************
//
template < typename T >
void Stack< T >::pop ()
{
//
if (isEmpty())
throw std::logic_error("Stack underflow error");
// -
m_pTop--;
}
//*****************************************************************************
//
template < typename T >
T& Stack< T >::top () const
{
//
if (isEmpty())
throw std::logic_error("Stack is empty");
// , -
return *(m_pTop - 1);
}
//*****************************************************************************
//
template < typename T >