.


:




:

































 

 

 

 





 

- :

 

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 >





:


: 2017-01-21; !; : 626 |


:

:

.
==> ...

1368 - | 1210 -


© 2015-2024 lektsii.org - -

: 0.145 .