两个C++小问题汇总

本文对近期使用C++的两个问题进行汇总。 ...

2018-01-07 · qhsong

C++指向成员函数指针

C++的语法总是会隐藏在一些边角上的语法,让你觉得还能这么干。最近在了解boost::bind的时候发现了这个语法,之前都不了解这个语法的。拿出来介绍一下,也算记录一下。这个语法在boost::bind还有Inside C++ Object Model中都有用到。 代码和表达均来自与ref[1]。 成员函数指针 废话不多说,上代码: class Foo { public: int f(string str) { cout<<"Foo::f()"<<endl; return 1; } }; int main() { int (Foo::*fptr)(string) = &Foo::f; Foo obj; (obj.*fptr)("str"); Foo *p = &obj; (p->*fptr)("str"); } 如上代码所示, int (Foo::*fptr)(string)定义了一个Foo类中的一个成员函数指针,其指向了Foo::f函数。相比起普通函数存放的是函数所指向的地址,其存放的是这个函数在类中相对的offset,这样只要是有相同的内存offset的均能互相转换。 所以要调用它,必须绑定在对应的class object的地址上,才能调用该函数。 ...

2017-10-15 · qhsong

sofa-pbrpc源码分析(1)

介绍 sofa-pbrpc是百度开源的一个C++ RPC库,使用Google Protobuf作为序列化协议,Asio网络库开发的一个C++ RPC库,现在有很多公司也都在使用。用他来学习boost::asio,C++11的一些新语法是个不错的选择。 计划会通过一系列的文章来研究这个库,并且学习他的一些用法,以及C++语法的笔记。 一个典型的服务器端程序如下所示: int main() { SOFA_PBRPC_SET_LOG_LEVEL(NOTICE); sofa::pbrpc::RpcServerOptions options; options.work_thread_num = 8; sofa::pbrpc::RpcServer rpc_server(options); if(!rpc_server.Start("0.0.0.0:12321")) { SLOG(ERROR, "start server failed"); return EXIT_FAILURE; } sofa::pbrpc::test::EchoServer *echo_service = new EchoServerImpl(); if (!rpc_server.RegisterService(echo_service)) { SLOG(ERROR, "register service failed!"); return EXIT_FAILURE; } rpc_server.Run(); rpc_server.Stop(); return EXIT_SUCCESS; } RpcServerOptions类里面主要是启动server的一些参数,位于rpc_server.h文件中,主要定义的是Server的启动参数,如工作线程数量、io_service 池大小、keep_alive时间等。 ...

2017-05-26 · qhsong