C++11 중 std::referencewrapper의 이해

2629 단어

std::reference_wrapper

  • reference_wrapper는 인용을 하나의 대상, 즉 인용의 포장기로 포장한다.
  • reference_wrapper는 인용 패키지로서 지향 대상이나 지향 함수 바늘의 인용을 패키지할 수 있으며 복사 구조를 통해 할 수도 있고 부치 구조를 통해 할 수도 있다.
  • std::reference_wrapper의 실례는 대상이지만 T&로 은밀하게 변환되기 때문에 std::reference랩퍼는 패키지 형식을 매개 변수로 하는 함수의 실참으로 사용할 수 있습니다.[너무 까다롭다. 위 원문: Instances of std::reference wrapper are objects(they can be copied or stored in containers) but they are implicitly convertible to T&, so that they can be used as arguments with the functions that take the underlying type by reference.]다음 코드에서 함수func의 매개 변수 형식은 int이고func에 전달되는 매개 변수는 확실히 std::referencewrapper 유형의 대상입니다.이 특성은 레퍼런스wrapper 대상은 함수 실참의 관건이 될 수 있다.
  • void func(int param){
        std::cout <<  param << std::endl;
    }
    int a = 3;
    std::reference_wrapper ra = a;
    func(ra);
    
  • referencewrapper 패키지의 인용은 호출할 수 있으면referencewrapper 대상도 호출 가능;
  • std::ref와std::cref는 보통referencewrapper 대상;
  • reference_wrapper는 항상 인용을 통해 대상을 std::bind 함수 또는 std::thread 구조 함수에 전달합니다.

  • std::reference_이 가능하다, ~할 수 있다,...

    template 
    class reference_wrapper {
    public:
      // types
      typedef T type;
     
      // construct/copy/destroy
      reference_wrapper(T& ref) noexcept : _ptr(std::addressof(ref)) {}// ref 
      reference_wrapper(T&&) = delete;//  , 
      reference_wrapper(const reference_wrapper&) noexcept = default;// reference_wrapper 
     
      // assignment
      reference_wrapper& operator=(const reference_wrapper& x) noexcept = default;
     
      // access
      operator T& () const noexcept { return *_ptr; }// T& 
      T& get() const noexcept { return *_ptr; }
     
      template< class... ArgTypes >
      std::invoke_result_t
        operator() ( ArgTypes&&... args ) const {
        return std::invoke(get(), std::forward(args)...);
      }
     
    private:
      T* _ptr;
    };
    

    std::reference_wrapper 사용 실례

    #include 
    #include 
    using namespace std;
    
    void func(int a, int b)
    {
        cout << "a = " << a < f0 = func;
        f0(5,7);
    
        auto f1 = std::ref(func);
        f1(5,7);
    
        //  bind 
        int i = 10;
    
        auto f2 = std::bind(func1, i);
        auto f3 = std::bind(func1, std::ref(i));
    
        i = 30;
    
        f2();
        f3();
    
        return 0;
    }
    
    //a = 5,b = 7
    //a = 5,b = 7
    //i = 10
    //i = 30
    

    참고 자료

  • C++ Difference between std::ref(T) and T&?
  • std::reference_wrapper
  • std::ref, std::cref
  • 좋은 웹페이지 즐겨찾기