컬렉션의 표준 출력 범위를 인쇄하는 보편적 인 함수를 작성하고 싶습니다. 그것은 보편적 있어야하기 때문에 나는 가정템플릿 인수의 형식을 지정하는 방법 STL 반복자 형식
std::vector<std::string> names = { "John", "Henry", "Mark" };
뿐만 아니라 ... 그 :
std::vector<int> years = { 100, 200, 400 };
.. 인쇄 할 수있을 것입니다.
수집의 종류가 다를 수 있습니다, 그리고 나에게 내가 템플릿 기능을 사용하여 기본 클래스의 반복자를 전달하는 기회를 제공하는 STL 수집을위한 기본 클래스가 없기 때문에 :
이template<typename TIterator>
void PrintRange(TIterator beginIter,TIterator endIter)
{
for(auto it = beginIter; it != endIter; ++it)
{
std::cout << *it << std::endl;
}
}
모든 것이 지금 잘 작동이, 지금은 쓸 수 있습니다 :
PrintRange(names.begin(), names.end());
과 :
PrintRange(years.begin(), years.end());
하지만 지금은 그가 원하는 lp 클라이언트가 내 기능을 사용하면 오류가 발생하는 이유를 빨리 이해할 수 있습니다. 지금은 전화 할 때 :
main.cpp:23:34: error: invalid type argument of unary ‘*’ (have ‘int’)
내가 좋아하는 뭔가를 인쇄하고 싶습니다 :
PrintRange(100, 400);
오류가 있습니다
One of arguments does not correspond to expected argument of type 'iterator'
그래서이 문제에 어떻게 접근 방식은 최고 :
걱정하지 않아도됩니다. 오류 메시지는 내가 예상 한대로 의미가있는 이 아닙니다. 사용자는 템플릿 클래스 코드를 으로 분석하여 실수의 원인을 확인해야합니다.
모든 가능한 가능성을 주장하기 위해 static_assert를 사용합니다.하지만 기본 클래스가 없으므로 function의 인수가 반복자임을 주장하는 방법은 무엇입니까?
static_assert(std::is_base_of::iterator >::value);
이는 문자열 반복자의 벡터를 주장하는 것입니다 ...
왜 다른 유형의 시작과 끝 반복자입니까? 그것들은 같은 것이어야합니다 – Fureeish
함수에 좋은 문서를 추가하면 사용자는 템플릿 코드를 검사 할 필요가 없으며 입력의 유효성 검사에 추가 작업을 할 필요가 없습니다. 컴파일러가 유효하게합시다! –