템플릿에 템플릿 별칭 사용

Jan 09 2021

책 읽기 A tour of c ++ (second edition), 2018 , 템플릿에 대한 설명을 이해하지 못했습니다 (아래에서 설명하겠습니다).

두 기능 서명이 주어진다 find_all반환 함수 vectoriterator주어진에서 주어진 값의 모든 항목에들 container.

#1 :

template<typename C, typename V>
vector<typename C::iterator> find_all(C& c, V v);

# 2 :

template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>> find_all(C& c, V v) ;

둘 다 다음과 같이 사용할 수 있습니다.

string m {"Mary had a little lamb"};
for (auto p : find_all(m,'a')) // here p is a string::iterator
    cout << *p << endl; // spoiler alert : this will print 'a's

별칭 템플릿을 사용하는 # 2는 다음과 같이 말합니다.

Iterator에 대한 유형 별칭을 도입하여 구현 세부 사항을 숨 깁니다.

저자에 의해.

두 가지 템플릿 사용을 모두 이해한다고 생각하지만 # 2가 "구현 세부 사항을 숨기는"이유와 선호하는 이유를 이해하지 못합니다. 누구든지 설명해 주시겠습니까?

감사 !

postscriptum : 유용하지 않다고 생각하기 때문에 기능에 대한 정의를 게시물에 제공하지 않았습니다 (두 서명 모두 동일).하지만 누군가 필요하면 추가하겠습니다.

답변

6 NathanOliver Jan 09 2021 at 05:54

다음과 같은 코드 기반이 있다고 가정 해 보겠습니다.

template<typename C, typename V>
vector<typename C::iterator> first(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> second(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> third(C& c, V v);
template<typename C, typename V>
vector<typename C::iterator> fourth(C& c, V v);
...

const_iterator대신 벡터를 반환 iterator하도록 변경하려면 해당 함수를 모두 변경해야합니다. 사용할 때

template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>>  first(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  second(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  third(C& c, V v);
template<typename C, typename V>
vector<Iterator<C>>  fourth(C& c, V v);

당신이해야 할 일은 변화

template<typename T>
using Iterator = typename T::iterator;

...에

template<typename T>
using Iterator = typename T::const_iterator;

그리고 당신은 끝났습니다. 이것이 "구현 세부 사항을 숨기는"방법입니다.