2017-09-06 4 views
3

항목을 추가하는 함수를 작성하고 싶습니다. addItem 및 addItems에 각각 move variant가 있습니다. 후자는 2 개의 입력 반복자를 허용합니다. 단일 항목을 추가하려면 rvalue 참조로 서명을 오버로드 할 수 있습니다. 하지만 move semantics와 함께 작동하도록 템플릿 함수를 오버로드하려면 어떻게해야합니까?이동 의미론 반복자 및 템플릿 사용 방법

void addItem(const shared_ptr<Item>& item, uint score) { 
    // code that copies the shared_ptr… 
} 

void addItem(shared_ptr<Item>&& item, uint score) { 
    // code that moves the shared_ptr… 
} 

template<typename Iterator> 
void addItems(Iterator begin, Iterator end) { 
    /* 
    * What to do here to take both move and normal iterators? 
    * Since I cannot overload by signature I dont know how to 
    * differentiate between move and non move iterators 
    */ 
} 

함수에 대해 단일 이름을 사용할 수 있으며 입력 반복기를 구별 할 수 있습니까?

+2

당신이로 봤어 ['표준 : make_move_iterator'] (http://en.cppreference.com/w/cpp/iterator/make_move_iterator)? – CoryKramer

+0

나는 가지고 있지만, 움직이는 것과 움직이지 않는 반복자를 모두 받아들이는 함수를 오버로드하는 법을 이해하지 못한다. – ManuelSchneid3r

+0

@ ManuelSchneid3r : 현재 서명이 _all_ 반복자를 허용합니다. –

답변

4

목록에 삽입 할 때 반복자를 사용하기 때문에 가장 간단한 해결책은 이동 반복자를 사용하는 것입니다. 이동 반복자를 사용하면 템플릿 함수 addItems을 변경할 필요가 없습니다.

template<typename Iterator> 
void moveItems(Iterator begin, Iterator end) { 
    std::move(begin, end, thelist.end()); 
} 

이 과부하가 각 요소를 이동할 것이다하면 std::move 알고리즘을 사용하는 이동 인서트 기능을 제공 할 수있는 대안

// Same function as before 
addItems(
    std::make_move_iterator(someList.begin()), 
    std::make_move_iterator(someList.end()) 
); 

: 이동 반복기 새 용기로 지칭 요소 이동 thelist 컨테이너. std::move 알고리즘은 정상적인 비 const 반복기와 함께 사용하기위한 것입니다. 이동 항목 함수는 같이 사용됩니다

std::vector<int> vec{1, 2, 3}; 

// move each ints into the new container 
moveItems(vec.begin(), vec.end()); 

// With your old function, move semantics 
// can still be applied with move Iterators 
addItems(
    std::make_move_iterator(vec.begin()), 
    std::make_move_iterator(vec.end()) 
); 
+0

이동 반복자를 전달하지 않으면 어떻게됩니까? 나 둘 다 필요해. – ManuelSchneid3r

+1

@ ManuelSchneid3r 두 가지 모두? 이 대답을 향상시킬 수있는 방법이 있습니까? –

+0

그럼 하나의 함수에서 참조를 전달하고 다른 함수에서 rvalue 참조를 전달하여 addItem 함수를 오버로드 할 수 있습니다. Templatet 함수의 경우는 그렇지 않습니다. 그래서 addItem 함수처럼 r 및 lvalue 참조에 대해이 addItems 함수를 오버로드 할 수있는 방법을 알고 싶습니다. moveItems 함수에 일반 이터레이터 (비 이동)를 전달하면 어떻게됩니까? – ManuelSchneid3r