2012-07-05 2 views
3

저는 C++의 참조 값을 처음 사용하고 일상 생활에서 사용하는 방법을 배우고 싶습니다. 인기있는 사용법에 관한 두 가지 질문이 있습니다 : 부울 :: 참조와 부스트 :: 바인드를 사용하여 rvalue 참조를 사용합니다.부울 값 참조를 boost :: in_place 함수에 전달합니다.

  1. 부스트를 rvalue 심판을 사용 :: in_place

클래스를 고려, 생성자 매개 변수로를 rvalue 참조를 복용 :

struct A 
    : boost::noncopyable 
{ 
    A(int&&){} 
}; 

의 지금하자이를 위해 부스트 옵션 변수를 만들려고 수업 :

void foo(int&& value) 
{ 
    boost::optional<A> opt; 
    // some code here 
    opt = boost::in_place(std::forward<int>(value)); //Error! 
} 

올바른 값을 전달하는 방법은 무엇입니까? 그런 예에서 ref. rvalue refs에 대한 boost :: reference_wrapper와 같은 솔루션이 있습니까? r- 수치 참조

다른 일반적인 쓰임새에 객체를 작동 바인드 펑 전달

  1. 을 높일 :: 함수 객체 부스트 : 바인드 펑 객체를 할당한다.

    void foo(int&&) 
    { 
    } 
    
    void bar() 
    { 
        boost::function<void(int&&)> func; 
    
        int x = 0; 
        func = boost::bind(foo, std::move(x)); // Compilation error (a) 
    
        func = boost::bind(foo, _1); // Compilation error too (b) 
    } 
    

    I는 해당 명령 (a) 첫 번째 호출 후에 정의 변수 값을 초래할 수 이해하지만, 명령의 (B)에도 이와 같은 문제가 없다. 그러나이 코드를 올바르게 작성하는 방법은 무엇입니까?

+3

나는 라이브러리와 C++ 11 개 기능을 사용하지 않는 것이 좋습니다 :이 같은

은 내가 그 일을하는 것이 좋습니다 모르겠어요,하지만 당신은 부스트에서 일반 과부하를 처리 할 수 ​​있습니다 C++ 11을 모르는 C++ 03 용으로 작성되었습니다. 그러한 용도가 지원되는지 문서를 확인하십시오. Boost.Optional 및 Boost.Function에 대한 내 지식이 최선이 아닙니다. –

+1

부스트 라이브러리는 대개 새 standart의 새로운 기능을 사용합니다 (C++ 11이 없어도 C++ 0x 만 해당). C++ 11에서 새로운 네이티브 'bind'및 'function'을 사용하여 두 번째 예제를 확인했습니다. C++ 11에서는 '선택 사항'이 없으므로 첫 번째 예제를 확인할 수 없습니다. –

답변

0

부스트 in_places는 기본적으로 이동 또는 r 값 참조를 지원하지 않습니다. 그러나 boost :: in_place_factory_base에서 상속받은 새 클래스를 만들고 직접 만들 수 있습니다. 또는 emplace 함수를 지원하는 옵션을 사용할 수도 있습니다 (예 : folly :: Optional).

#include <boost/optional.hpp>  
#include <boost/utility/in_place_factory.hpp> 
#include <folly/ApplyTuple.h> 

namespace boost                  
{                     
    template<class ... As> 
    struct rvalue_in_place : public in_place_factory_base 
    { 
    mutable std::tuple<As...> tup_; 
    rvalue_in_place(As ... as) 
     : tup_(std::forward<As>(as)...) 
    { 
    }                     
    template< class T > 
    void apply (void* address) const 
    { 
    auto make = [address](As ... as) { new (address) T(std::forward<As>(as)...); }; 
    folly::applyTuple(make, tup_); 
    } 
}; 
template <class ... As> 
rvalue_in_place<As&&...> in_place(As && ... a) 
{ 
    return rvalue_in_place<As&&...>(std::forward<As>(a)...); 
} 
} 
+0

Thx, @capsterx. 나는 boost :: in_place에 대해 이미 [patch] (https://svn.boost.org/trac/boost/attachment/ticket/1841/14-optional-partial-rvalue.2.patch)를 발견했습니다. rvalue. 동시에 부스트의 릴리스 (boost tracker)에이 기능을 추가하겠다는 약속이있었습니다 (https://svn.boost.org/trac/boost/ticket/1841) –