2016-09-13 7 views
0

가정하자 나는 몇 가지 데이터를 보유하는 객체가 있습니다올바른 매개 변수 유형

struct Object 
{ 
    std::vector<float> data; 
} 

그리고 일부 개체 유지하는 구조체 :

struct Holder 
{ 
    private: 
    std::vector<Object> objects_; 
} 

호출 코드가 객체를 구축하고 싶어를 Object가 수백만 개의 요소를 포함 할 수 있으므로 복사본을 만들지 않고 Holder에 추가합니다.

struct Holder 
{ 
    void addObject(Object& object) 
    { 
     objects_.push_back(std::move(object)); 
    } 
    private: 
    std::vector<Object> objects_; 
} 

그러나, 다른 프로그래머가 홀더에 전달 된 객체가 :: addObject가 지정되지 않은 상태로두고 그 위에 계속 작동합니다 알고하지 않을 수 있습니다 : 내 초기 생각은 홀더가 이동을 처리 할 수 ​​있도록했다. 따라서, 나는 다른 사본이 구성되어, 명시 적으로 사본으로 객체를 이동하는 코드를 호출에두고 : 같은

struct Holder 
{ 
    void addObject(Object object) 
    { 
     objects_.push_back(std::move(object)); 
    } 
    private: 
    std::vector<Object> objects_; 
} 

호출 코드는 다음 같습니다 표준의 사용인가

Holder h; 
Object o; 
// populate c 

h.addObject(std::move(o)) 

:: 이 맥락에서 움직이는 것이 맞습니까? 이 대안을 처리하는보다 정확하고 분명한 방법이 있습니까?

+0

만들기'Object' 이동하지만, 복사 가능한 당신이 뭔가를 잘못 할 경우 컴파일러는 당신을 말할 것이다 없습니다 – Slava

답변

3

개체의 구성을 홀더의 벡터로 옮길 수 있습니다. 또한 rvalue를 전달할 수 있습니다 (이 값은에서 이동할 수 있음). 매개 변수의

template<typename... Args> 
void emplaceObject (Args... && args) { 
    objects_.emplace_back(std::forward<Args>(args)...); 
} 

std::forward 전달 값 범주, 즉 당신이를 rvalue와 함수를 호출하는 경우, 다음 std::vector:: emplace_back()가도를 rvalue를 얻을 것입니다.

따라서 h.emplaceObject(std::move(o))Object의 이동 생성자를 한 번 호출합니다.

, BTW이가 호출 perfect forwarding.