.


:




:

































 

 

 

 


BoolStack< T >::isFull () const




{

return (m_pTop - m_pData) == m_size;

}

 

//*****************************************************************************

 

#endif // _STACK_HPP_

 

 

. , . , T , , ( ).

 

test_stack.cpp

 

//*****************************************************************************

 

#include "stack.hpp"

 

#include <string>

#include <cassert>

 

//*****************************************************************************

 

int main ()

{

//

Stack< int > s1;

s1.push(5);

assert(! s1.isEmpty() && s1.top() == 5);

 

//

Stack< double > s2;

s2.push(2.5);

assert(! s2.isEmpty() && s2.top() == 2.5);

 

// -

Stack< std::string > s3;

s3.push("Hello");

assert(! s3.isEmpty() && s3.top() == "Hello");

 

// !

Stack< Stack< int > > s4;

s4.push(Stack< int >());

s4.top().push(5);

assert(! s4.isEmpty() &&!s4.top().isEmpty() && s4.top().top() == 5);

}

 

//*****************************************************************************

 

Stack< int > Stack< double >, . , , . , , - (member template). , , , , .

 

, private-:

 

template < typename T >

class Stack

{

 

//------------------------------------------------------------------------

 

public:

 

//...

 

 

// Stack Stack

template < typename > friend class Stack;

 

//

template < typename U >

Stack (std::initializer_list< U > _l);

 

// - -, U, U!= T

template < typename U >

Stack (const Stack< U >& _s);

 

//...

 

// - -

template < typename U >

Stack< T > & operator = (const Stack< U >& _s);

 

//...

 

};

 

:

 

template < typename T >

template < typename U > // , template, !

Stack< T >::Stack (std::initializer_list< U > _l)

: Stack(_l.size())

{

// U

for (const U & x: _l)

// T U T

push((const T &) x);

}

 

 

template < typename T >

template < typename U > // , template, !

Stack< T >::Stack (const Stack< U > & _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 ]); // U T

}

 

//*****************************************************************************

 

template < typename T >

template < typename U > // , template, !

Stack< T >& Stack< T >:: operator = (const Stack< U >& _s)

{

// - ,

// .. Stack<T> Stack<U>!

if ((const void *)(this) ==(const void *)(& _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 ]; // U T

 

//

m_pTop = m_pData + nActual;

 

//

return * this;

}

 

:

 

test_stack_conversions.cpp

 

//*****************************************************************************

 

#include "stack.hpp"

 

#include <string>

#include <cassert>

 

//*****************************************************************************

 

int main ()

{

//

Stack< int > s = { 1.5, 2.5, 3.5 };

assert(! s.isEmpty() && s.top() == 3); // 3.5 3

 

//

Stack< double > s1;

s1.push(2.5);

 

// !

Stack< int > s2 = s1;

assert(!s2.isEmpty() && s2.top() == 2); // 2.5 2

 

// C

Stack< const char * > s3;

s3.push("Hello");

 

// std::string,

//

Stack< std::string > s4;

s4 = s3;

assert(!s4.isEmpty() && s4.top() == "Hello");

}

 

//*****************************************************************************

 

, . - , .

 

, - :

 

#include <iostream>

 

class Test

{

public:

template < typename T >

void f (const T & _val)

{

std::cout << _val << std::endl;

}
};

 

int main ()

{

Test t;

t.f(5); // Test::f< int >

t.f(2.5); // Test::f< double >
}

 

Test.

 





:


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


:

:

, , . , .
==> ...

1505 - | 1345 -


© 2015-2024 lektsii.org - -

: 0.074 .