{
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.