08
typename์ 2๊ฐ์ง ์๋ฏธ
- ํฌํ๋ฆฟ์ ํ์ ๋งค๊ฐ๋ณ์ ์ ์ธ์(class์ ๋์ผ)
- ํฌํ๋ฆฟ ํจ์/ํด๋์ค ๋ด์์ ํฌํ๋ฆฟ์ ์์กดํ๋ ํ์
์ ์ด๋ฆ์ ํ์
์ด๋ผ๊ณ ์ปดํ์ผ๋ฌ์๊ฒ ๋งํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ.
template<typename C> ... { typename C::iterator iter = ...; /* ------(1) ---------(2) ------------------(3) -----------------------(4) (1) : ์ปดํ์ผ๋ฌ์ผ, iterator๋ผ๋ ํค์๋๋ (2) : ํฌํ๋ฆฟ์ธ์ C์ ์์กด์ ์ธ (3) : ํ์ ๋ช ์ด๋๋ค. (4) : ๋ด๊ฐ ๊ทธ ํ์ ์ผ๋ก iter๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ ๊ป๋ฐ... */ }
ex02
stack์ ์ปจํ ์ด๋์ ํ์ ์ค ์ปจํ ์ด๋ ์ด๋ํฐ์ ์ํ๋ฉฐ, ๊ธฐ์กด ์ปจํ ์ด๋()์์ ์ ๊ณตํ๋ฅ์ ์ ํ/๋ณํํ ์ปจํ ์ด๋์ด๋ค.
stack์ด์ธ์๋ queue, primery queue๊ฐ ์๋ค.
์คํ(stack)์ ์ ํ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ๋์ด ๊ตฌ์กฐ์ด๋ค. ๊ทธ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ธ์ ๋ ๋ชฉ๋ก์ ๋์์๋ง ์ผ์ด๋๋ค. ๋๋จผ์ ๋ด๊ธฐ ๋ชฉ๋ก(Pushdown list)์ด๋ผ๊ณ ๋ ํ๋ค. ์คํ์ ํ ์ชฝ ๋์์๋ง ์๋ฃ๋ฅผ ๋ฃ๊ฑฐ๋ ๋บ ์ ์๋ ์ ํ ๊ตฌ์กฐ(LIFO - Last In First Out)์ผ๋ก ๋์ด ์๋ค. ์๋ฃ๋ฅผ ๋ฃ๋ ๊ฒ์ โ๋ฐ์ด๋ฃ๋๋คโ ํ์ฌ ํธ์ฌ(push)๋ผ๊ณ ํ๊ณ ๋ฐ๋๋ก ๋ฃ์ด๋ ์๋ฃ๋ฅผ ๊บผ๋ด๋ ๊ฒ์ ํ(pop)์ด๋ผ๊ณ ํ๋๋ฐ, ์ด๋ ๊บผ๋ด์ง๋ ์๋ฃ๋ ๊ฐ์ฅ ์ต๊ทผ์ ํธ์ฌํ ์๋ฃ๋ถํฐ ๋์ค๊ฒ ๋๋ค. ์ด์ฒ๋ผ ๋์ค์ ๋ฃ์ ๊ฐ์ด ๋จผ์ ๋์ค๋ ๊ฒ์ LIFO ๊ตฌ์กฐ๋ผ๊ณ ํ๋ค. -์ํค๋ฐฑ๊ณผ-
์์ ๊ฐ์ ์คํ์ ํน์ฑ๋๋ฌธ์ ํน์ ์ ์ฅ์์น์ ์ ๊ทผํ ์ ์๋ ๋ฐ๋ณต์๋ฅผ ์ ๊ณตํ์ง ์๊ณ , pop, push๋ฑ ์คํ์ ๋งด๋ฒํจ์๋ค์ ์ ๊ณตํ๋ค.
๊ทธ๋ฐ๋ฐ stack์ ํค๋๋ฅผ ๊ฐ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด stack์ด ๊ตฌํ๋์ด ์๋ค.
...
// line 99
template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
...
// line 111
template <class _Tp, class _Container /*= deque<_Tp>*/>
class _LIBCPP_TEMPLATE_VIS stack
{
public:
typedef _Container container_type;
typedef typename container_type::value_type value_type;
typedef typename container_type::reference reference;
typedef typename container_type::const_reference const_reference;
typedef typename container_type::size_type size_type;
static_assert((is_same<_Tp, value_type>::value), "" );
...
//line 122
protected:
container_type c;
...
template <class _Tp, class _Container = deque<_Tp> > class _LIBCPP_TEMPLATE_VIS stack;
- class์ธ stack์ ํฌํ๋ฆฟ ํด๋์ค๋ก์, ํฌํ๋ฆฟ ์ธ์๋ก
_Tp
์_Container
๋ฅผ ๊ฐ์ง๋ค._Tp
๋ stack์ ์๋ฃํ์ด๋ค._Container
๋ stack๊ฐ ์ค์ ๋ก ์ ์ฅ๋๋ ์ปจํ ์ด๋์ ํํ์ด๋ฉฐ, ๋ณ๋ ์ง์ ์์์deque<_Tp>
ํ์ผ๋ก ์ ์ฅ๋๋ค(๋ํดํธ ํฌํ๋ฆฟ์ธ์).
_LIBCPP_TEMPLATE_VIS
๋ Symbol Visibility Macros ์ค ํ๋์ด๋ค. Symbol Visibility Macros๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํค๋์ ์์ ์ ์ธ ABI(์์ฉํ๋ก๊ทธ๋จ ์ด์ง ์ธํฐํ์ด์ค,์ด์ง ํํ์ API?)์ ๊ณตํ๋ ๋ฉํฌ๋ก๋ค์ด๋ค. Mark a typeโs typeinfo and vtable as having default visibility.???๋ผ๋ ์ญํ ์ ํ๋ค๊ณ ํ๋คโฆ(link)
template <class _Tp, class _Container /*= deque<_Tp>*/>
class _LIBCPP_TEMPLATE_VIS stack
{
public:
typedef _Container container_type;
typedef typename container_type::value_type value_type;
typedef typename container_type::reference reference;
typedef typename container_type::const_reference const_reference;
typedef typename container_type::size_type size_type;
static_assert((is_same<_Tp, value_type>::value), "" );
_Container
๋container_type
๋ก ํ์ ์ผ๋ก alias๋๋ค.- ์ฆ, ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปจํ
์ด๋์ ๋ฐ๋ณต์๋ฅผ
container_type
๋ฅผ ํตํด์ ์ ๊ทผํ ์ ์๋ค.
- ์ฆ, ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปจํ
์ด๋์ ๋ฐ๋ณต์๋ฅผ
protected:
container_type c;
- stack์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์ปจํ
์ด๋์ ๋งด๋ฒ๋ณ์๋
c
์ด๋ฉฐ, ์์ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ๊ณผ์ ๊ตฌํ์ ์ํด ๋ฐ๋ณต์๋ฅผ ๋ฐ๋ก ๊ตฌํํ ํ์ ์์ด, ์ค์ ์ ์ฅ๋๋ ์ปจํ ์ด๋์ ์ ๊ทผํ์ฌ ๋ฐ๋ณต์๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ ์ ์๋ค.
๊ตฌํ์ฝ๋
template<typename T>
class MutantStack : public std::stack<T>
{
...
public:
typedef typename std::stack<T>::container_type::iterator iterator;
iterator begin() throw()
{
return this->c.begin();
}
iterator end() throw()
{
return this->c.end();
}
}
template<typename T>
class MutantStack : public std::stack<T>
MutantStack
์std::stack<T>
๋ฅผpublic
์ผ๋ก ์์ํ๋ค.- stack์ ํฌํ๋ฆฟ์ธ์๋ก ์ปจํ
์ด๋ ์๋ฃํ์ ์๋์ผ๋ก ์ค์ ํ ์ ์์ง๋ง, ๋ฐ๋ณต์๊ฐ ์๋ ์ปจํ
์ด๋๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋์ ์ด๋ฅผ ์ค์ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๊ณ stack์ ๋ํดํธ๋ก ์ฌ์ฉ๋๋
deque<_Tp>
๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- stack์ ํฌํ๋ฆฟ์ธ์๋ก ์ปจํ
์ด๋ ์๋ฃํ์ ์๋์ผ๋ก ์ค์ ํ ์ ์์ง๋ง, ๋ฐ๋ณต์๊ฐ ์๋ ์ปจํ
์ด๋๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋์ ์ด๋ฅผ ์ค์ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๊ณ stack์ ๋ํดํธ๋ก ์ฌ์ฉ๋๋
typedef typename std::stack<T>::container_type::iterator iterator;
std::stack<T>
์container_type
(=deque<_Tp>
)์ ๋ฐ๋ณต์ ํ์ ์iterator
ํ์ ๋ช ์ด๋ผ๊ณ ์๋ฆฌ์ด์ค ํ๋ค.
iterator begin() throw()
{
return this->c.begin();
}
iterator end() throw()
{
return this->c.end();
}
- stack์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋งด๋ฒ๋ณ์
c
๋ก ๋ถํฐ ๋ฐ๋ณต์๋ฅผbegin()
๊ณผend()
๋ก ๋ฐ๋๋ค. ์ด๋ c๋deque<_Tp>
ํ์ ๊ณ ์ ์ด๋ฏ๋ก ๋ฌธ์ ์๋ค.
์ฐธ๊ณ ํ ๊ณณ : ํผ์ ์ฐ๊ตฌํ๋ C/C++