包含标签 CPP 中的文章

C++14 lambda 用法

1 嵌套lambda表达式 写一个lambda表达式A,其入参是一个lambda表达式B: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #include <cstdio> #include <iostream> namespace example01 { template<typename Func> void run_task(Func &&func) { int arg = 100; printf("1. arg >> %d\n", arg); /** * 定义一个别名,进行引用捕获 * (注意:引用捕获时,请考虑被捕获对象的生命周期) */ func([&i = arg]() mutable { ++i; printf("3. i == %d\n", i); throw std::logic_error("逻辑错误"); }); printf("6. arg << %d\n", arg); } inline void run() { //写一个lambda表达式A,其入参是一个lambda表达式B example01::run_task([](auto get_ex) { printf("2. start check\n"); try { get_ex(); } catch (std::exception &ex) { std::cout << "4.……

阅读全文

C++ RAII

什么是RAII ? RAII即“Resource Acquisition Is Initialization”,也称为“资源获取即初始化”。是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。 RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。……

阅读全文

c和c++混用技巧

1 用C-style 来访问vector 1 2 3 4 5 6 7 8 vector<char*> str; str.push_back("abc"); str.push_back("123"); //按照 C-style 来访问vector char** ptr= str.data(); for(int i =0;i<2;++i) printf("%s\n",ptr[i]);……

阅读全文

C++11 std::function 和 std::bind

1 std::bind std::bind 可以用来绑定一个函数 std::placeholders; 定义有_1、_2、_3 … 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <functional> using namespace std; using namespace std::placeholders; int f(int, char, double); int main() { // 翻转参数顺序 auto frev = bind(f, _3, _2, _1); int x = frev(1.2, 'w', 7); cout<<x<<endl; return 0; } int f(int a, char b , double c) { cout<<"a=="<< a <<",b==" <<b << ",c=="<<c <<endl; return 0; } 2 std::function std::function 可以用来定义一个函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 int add(int a, int b){ return a+b; } auto mod=[](int a, int b){return a%b;}; struct divide{ int operator()(int m, int n){ return m/n; } }; int main() { function<int(int,int)> func1= add; function<int(int,int)> func2= mod; function<int(int,int)> func3= divide(); cout<<func1(5, 6)<<endl; cout<<func2(5, 6)<<endl; cout<<func3(5, 6)<<endl; return 0; }……

阅读全文

C++11 特性:成员函数引用限定符(Reference qualifier)

1 引用限定符 学了这么多年C++,今天拜读了Scott Meyes的《more effective cpp》,第一次看到这种写法… 引用限定可以让成员函数只能被左值对象调用或者只能被右值对象调用。 下面举例说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 namespace left_value { class Hello { void show() & { std::cout << "just for left-value\n"; } }; inline void run() { Hello t; t.show(); // ok Hello{}.show(); // compile error: passing 'left_value::Hello' as 'this' argument discards qualifiers [-fpermissive] } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 namespace right_value { struct Test { void show() && { std::cout << " just for right value\n"; } }; inline void run() { Test t; t.show(); //compile error: passing 'right_value::Test' as 'this' argument discards qualifiers [-fpermissive] Test{}.show(); //ok } } 换句话说,引用限定所限定的就是*this,它可以让一些函数只被左值this调用或者右值……

阅读全文

C++11 explicit关键字

C++中的explicit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Test1 { public: Test1(int n) { num=n; }//普通构造函数 private: int num; }; class Test2 { public: explicit Test2(int n) { num=n; }//explicit(显式)构造函数 private: int num; }; int main() { Test1 t1=12; //隐式调用其构造函数,成功 Test2 t2=12; //编译错误,不能隐式调用其构造函数 Test2 t2(12); //显式调用成功 return 0; }……

阅读全文

posix 进程 vs. 线程

进程和线程api对比 进程 线程 pid_t thread_t fork pthread_create waitpid pthread_jion exit pthread_exit 在main函数中调用return 在线程函数中调用return 僵进程 僵线程 wait_pid pthread_jion pthread_detach kill pthread_cancel 知识点 1 使用pthread_detach 方法脱离一个线程就不会产生僵线程。 2 获取当前县城id 3 pthread_cancel可以杀死一个执行中的线程。 线程结束 自杀: pthread_exit ,在线程入口函数中调用return. 他杀: pthread_cancel……

阅读全文

Linux 服务端编程(一)

ftok()函数 系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 函数原型:key_t ftok( const char * fname, int id ); (id>0) fname就是你指定的文件名(已经存在的文件名),一般使用当前目录。 在一般的UNIX实现中,是将文件的索引节点号取出。(文件重建将会分配一个新的索引节点号) ftok 返回值组成:hex(id)&0xff03 hex(节点号)&0xffff。 传入的id低8位+0x03+ 节点号的低16位。(test on redhat ) 可通过 ls -l 查看文件节点值。……

阅读全文

最近文章

分类

友情链接

标签

其它