2013-09-30 4 views
12

std :: vector 참조를 인수로 사용하는 클래스 메서드를 만들고 싶습니다. 다른 유형의 데이터와 함께 사용하고 싶습니다.std :: vector를 템플릿 함수 인수로 사용

그래서 기능처럼 만들고 싶어 :

void some_function(const std::vector & vect){ //do something with vector } 

내가 예를 들어 그것을 사용하려면 :

std::vector<int> v1; 
some_function(v1); 
std::vector<string> v2; 
some_function(v2); 

내가 내 지점을 분명히 바랍니다.

template<class T> 
void some_function(std::vector<T> & vect){} 

아니면 다른 방법으로 작업을 수행 할 수 있습니다 내가 그런 템플릿 방법을해야합니까? 해야만한다면 수업에서 그 방법을 어떻게 쓸 수 있는지 말해주세요

고마워요!

+0

네, 그렇게하는 방법입니다. 아니면 다른 것을 요구하고 있습니까? – jrok

+2

당신에게 잘못된 것이 제안 되었습니까? – Asaf

+0

이 질문에 대한 답은 스스로 충분합니다. 만약 누군가가 그런 벡터를 반복하고 싶다면'for (typename vector :: const_iterator it = vect.begin(); it! = vect.end(); ++ it)' –

답변

22

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>::typestd::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가 몇 가지 요구 사항 조항으로 붕괴 될 것이므로 훨씬 쉽게 만들 수 있습니다.

관련 문제