模板中的&& 万能引用
- void Fun(int &x){ cout << "左值引用" << endl; }
- void Fun(const int &x){ cout << "const 左值引用" << endl; }
- void Fun(int &&x){ cout << "右值引用" << endl; }
- void Fun(const int &&x){ cout << "const 右值引用" << endl; }
- // 模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。
- // 模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力,
- // 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值
- template<typename T>
- void PerfectForward(T&& t)
- {
- Fun(t);
- }
- int main()
- {
- PerfectForward(10);// 右值
- int a;
- PerfectForward(a); // 左值
- PerfectForward(std::move(a)); // 右值
- const int b = 8;
- PerfectForward(b);// const 左值
- PerfectForward(std::move(b)); // const 右值
- return 0;
- }
- void Fun(int& x) { cout << "左值引用" << endl; }
- void Fun(const int& x) { cout << "const 左值引用" << endl; }
- void Fun(int&& x) { cout << "右值引用" << endl; }
- void Fun(const int&& x) { cout << "const 右值引用" << endl; }
- // std::forward
(t)在传参的过程中保持了t的原生类型属性。 - template<typename T>
- void PerfectForward(T&& t)
- {
- Fun(std::forward
(t)); - }
- int main()
- {
- PerfectForward(10); // 右值
- int a;
- PerfectForward(a); // 左值
- PerfectForward(std::move(a)); // 右值
- const int b = 8;
- PerfectForward(b); // const 左值
- PerfectForward(std::move(b)); // const 右值
- return 0;
- }
- // Args是一个模板参数包,args是一个函数形参参数包
- // 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
- template <class ...Args>
- void ShowList(Args... args)
- {}
- // 递归终止函数
- template <class T>
- void ShowList(const T& t)
- {
- cout << t << endl;
- }
- // 展开函数
- template <class T, class ...Args>
- void ShowList(T value, Args... args)
- {
- cout << value << " ";
- ShowList(args...);
- }
- int main()
- {
- ShowList(1);
- ShowList(1, 'A');
- ShowList(1, 'A', std::string("sort"));
- return 0;
- }
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量 性。使用该修饰符时,参数列表不可省略(即使参数为空)
- int main()
- {
- // 最简单的lambda表达式, 该lambda表达式没有任何意义
- [] {};
-
- // 省略参数列表和返回值类型,返回值类型由编译器推导为int
- int a = 3, b = 4;
- [=] {return a + 3; };
-
- // 省略了返回值类型,无返回值类型
- auto fun1 = [&](int c) {b = a + c; };
- fun1(10)
- cout << a << " " << b << endl;
-
- // 各部分都很完善的lambda函数
- auto fun2 = [=, &b](int c)->int {return b += a + c; };
- cout << fun2(10) << endl;
-
- // 复制捕捉x
- int x = 10;
- auto add_x = [x](int a) mutable { x *= 2; return a + x; };
- cout << add_x(10) << endl;
- return 0;
- }
- #include
- using func_t = std::function<int(int, int)>;
- int add(int x, int y)
- {
- return x + y;
- }
-
- int main()
- {
- int a = 1; int b = 1;
- func_t f = add;
- std::cout<<f(a, b) << std::endl;
- return 0;
-
- }
- #include
- #include
-
- class A {
- public:
- void fun_3(int k,int m) {
- std::cout << "print: k = "<< k << ", m = " << m << std::endl;
- }
- };
-
- void fun_1(int x,int y,int z) {
- std::cout << "print: x = " << x << ", y = " << y << ", z = " << z << std::endl;
- }
-
- void fun_2(int &a,int &b) {
- ++a;
- ++b;
- std::cout << "print: a = " << a << ", b = " << b << std::endl;
- }
-
- int main(int argc, char * argv[]) {
- //f1的类型为 function
- auto f1 = std::bind(fun_1, 1, 2, 3); //表示绑定函数 fun 的第一,二,三个参数值为: 1 2 3
- f1(); //print: x=1,y=2,z=3
-
- auto f2 = std::bind(fun_1, std::placeholders::_1, std::placeholders::_2, 3);
- //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f2 的第一,二个参数指定
- f2(1, 2); //print: x=1,y=2,z=3
-
- auto f3 = std::bind(fun_1, std::placeholders::_2, std::placeholders::_1, 3);
- //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f3 的第二,一个参数指定
- //注意: f2 和 f3 的区别。
- f3(1, 2); //print: x=2,y=1,z=3
-
- int m = 2;
- int n = 3;
- auto f4 = std::bind(fun_2, std::placeholders::_1, n); //表示绑定fun_2的第二个参数为n, fun_2的第一个参数由调用f4的第一个参数(_1)指定。
- f4(m); //print: a=3,b=4
- std::cout << "m = " << m << std::endl; //m=3 说明:bind对于不事先绑定的参数,通过std::placeholders传递的参数是通过引用传递的,如m
- std::cout << "n = " << n << std::endl; //n=3 说明:bind对于预先绑定的函数参数是通过值传递的,如n
-
- A a;
- //f5的类型为 function
- auto f5 = std::bind(&A::fun_3, &a, std::placeholders::_1, std::placeholders::_2); //使用auto关键字
- f5(10, 20); //调用a.fun_3(10,20),print: k=10,m=20
-
- std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);
- fc(10, 20); //调用a.fun_3(10,20) print: k=10,m=20
-
- return 0;
- }
atmoic t; // 声明一个类型为T的原子类型变量t
- #include
- int main()
- {
- atomic<int> a1(0);
- //atomic
a2(a1); // 编译失败 - atomic<int> a2(0);
- //a2 = a1; // 编译失败
- return 0;
- }
- #include
- #include
- int number = 0;
- mutex g_lock;
- int ThreadProc1()
- {
- for (int i = 0; i < 100; i++)
- {
- g_lock.lock();
- ++number;
- cout << "thread 1 :" << number << endl;
- g_lock.unlock();
- }
- return 0;
- }
- int ThreadProc2()
- {
- for (int i = 0; i < 100; i++)
- {
- g_lock.lock();
- --number;
- cout << "thread 2 :" << number << endl;
- g_lock.unlock();
- }
- return 0;
- }
-
- int main()
- {
- thread t1(ThreadProc1);
- thread t2(ThreadProc2);
- t1.join();
- t2.join();
- cout << "number:" << number << endl;
- system("pause");
- return 0;
- }
线程函数调用try_lock()时,可能会发生以下三种情况: