template
기능 const&
에 의해 어떤 std::vector
을 수용하기위한 올바른 방법은 다음과 같습니다
template<typename T, typename A>
void some_func(std::vector<T,A> const& vec) {
}
두 번째 인수는 "할당"이며, std::vector
의 일부 고급 사용량이 기본이 될 수 없습니다. std::vector<T>
을 수락하면 some_func
은 대체 할당자를 사용하여 std::vector
을 거부합니다.
이제 다른 방법으로이 문제를 해결할 수 있습니다. 나는 그들을 비용 절감으로 나열 할 것입니다 : 이익 비율 - 위의 것은 아마도 당신이 원하는 것이고, 다음은 때로는 유용합니다. 그리고 나서 나는 거의 고려할만한 가치가없는 설계된 사례로 넘어갑니다 (그러나 유용 할 수도 있습니다 일부 코너 경우).
당신은 typename std::remove_reference<T>::type
이 std::vector
의 일종인지 확인 T&&
다음 시험에 의해 임의의 유형 T
을 받아 들일 수 있습니다. 이렇게하면 들어오는 std::vector
의 "완벽한 전달"을 할 수 있습니다. 또한 std::vector
이상을 받아들이는 데 사용하는 조건자를 변경할 수 있습니다. 대부분 const&
~ std::vector
은 임의의 임의 액세스 컨테이너가 필요합니다.
엄청나게 멋진 방법은 2 단계 기능을 수행하는 것입니다. 두 번째 단계는 들어오는 개체가 호환되는지 확인하기 위해 고정 유형 T
에 SFINAE가있는 유형 지우기 랜덤 액세스 범위보기 (또는 임의 액세스가 필요하지 않은 경우 범위보기 만 사용함)를 취합니다. 첫 번째 단계는 컨테이너 유형을 전달하고 SFINAE 컨텍스트 (auto some_func(...)->decltype(...)
)에서 두 번째 단계를 호출합니다. T
s의 랜덤 액세스 범위보기로 std::vector<T> const&
의 형태 삭제로
많은 기능을 잃지 않는다, 장점은
std::vector<T> const&
과
T[n]
및 대한 함수의 내용이 동일하다는 것을 보장 할 수 있다는 것
std::array<T,n>
입니다.
특히 상용구에 큰 이점은 아닙니다.
C++ 1y는 위의 다단계 SFINAE가 몇 가지 요구 사항 조항으로 붕괴 될 것이므로 훨씬 쉽게 만들 수 있습니다.
네, 그렇게하는 방법입니다. 아니면 다른 것을 요구하고 있습니까? – jrok
당신에게 잘못된 것이 제안 되었습니까? – Asaf
이 질문에 대한 답은 스스로 충분합니다. 만약 누군가가 그런 벡터를 반복하고 싶다면'for (typename vector :: const_iterator it = vect.begin(); it! = vect.end(); ++ it)' –