c++ bind ref 例子


// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // binding functions:
  auto fn_five = std::bind (my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '/n';                          // 5

  auto fn_half = std::bind (my_divide,_1,2);               // returns x/2
  std::cout << fn_half(10) << '/n';                        // 5

  auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/x
  std::cout << fn_invert(10,2) << '/n';                    // 0.2

  auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)
  std::cout << fn_rounding(10,3) << '/n';                  // 3

  MyPair ten_two {10,2};

  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  std::cout << bound_member_fn(ten_two) << '/n';           // 20  注意,这里ten_two 是引用 不是复制

//===========================================================================================
  auto bound_member_cpy = std::bind (&MyPair::multiply,ten_two);

  std::cout << bound_member_cpy() << '/n';                //  这里调用的ten_two 是复制版本不是引用版本



  auto bound_member_ref = std::bind (&MyPair::multiply,&ten_two); // returns ten_two.a

  std::cout << bound_member_ref() << '/n';                // 这里才是引用版本 同理,下行是复制版本
//===============================================================================================
auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a std::cout << bound_member_data() << '/n'; // 10 return 0; }

C++11 中引入 std::ref 用于取某个变量的引用,这个引入是为了解决一些传参问题。

std::ref 用于包装按引用传递的值。

std::cref 用于包装按const引用传递的值。

#include <functional>
#include <iostream>


void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: " << n1 << ' ' << n2 << ' ' << n3 << '/n';
    ++n1; // increments the copy of n1 stored in the function object
    ++n2; // increments the main()'s n2
    // ++n3; // compile error
}

int main()
{
    int n1 = 1, n2 = 2, n3 = 3;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    n1 = 10;
    n2 = 11;
    n3 = 12;
    std::cout << "Before function: " << n1 << ' ' << n2 << ' ' << n3 << '/n';
    bound_f();
    std::cout << "After function: " << n1 << ' ' << n2 << ' ' << n3 << '/n';
}

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/282681.html

(0)
上一篇 2022年8月28日
下一篇 2022年8月28日

相关推荐

发表回复

登录后才能评论