템플릿에 템플릿 별칭 사용
Jan 09 2021
책 읽기 A tour of c ++ (second edition), 2018 , 템플릿에 대한 설명을 이해하지 못했습니다 (아래에서 설명하겠습니다).
두 기능 서명이 주어진다 find_all
반환 함수 vector
의 iterator
주어진에서 주어진 값의 모든 항목에들 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;
그리고 당신은 끝났습니다. 이것이 "구현 세부 사항을 숨기는"방법입니다.