如何优雅地传递STL容器参数实现元素插入遍历?
摘要:c++ 虐我千百遍,我待 c++ 如初恋。从一个工程实际需求出发,看看通过 c++ 语法告诉编译器我们想达到的效果,到底需要经历多少
问题背景
开始正文之前,做一些背景铺垫,方便读者了解我的工程需求。我的项目是一个客户端消息分发中心,在连接上消息后台后,后台会不定时的给我推送一些消息,我再将它们转发给本机的其它桌面产品去做显示。后台为了保证消息一定可以推到客户端,它采取了一种重复推送的策略,也就是说,每次当我重新连接上后台时,后台会把一段时间内的消息都推给我、而不论这些消息之前是否已经推送过,如果我不加处理的直接推给产品,可能造成同一个消息重复展示多次的问题。为此,我在接收到消息后,会将它们保存在进程中的一个容器中,当有新消息到达时,会先在这个容器里检查有没有收到这条消息,如果有,就不再转发。
1 namespace GCM {
2 class server_msg_t
3 {
4 public:
5 void dump(char const* prompt);
6
7 std::string appname;
8 std::string uid;
9 std::string msgid;
10 time_t recv_first = 0;
11 time_t recv_last = 0;
12 int recv_cnt = 0;
13 };
14
15 class WorkEngine
16 {
17 public:
18 WorkEngine();
19 ~WorkEngine();
20
21 private:
22 // to avoid server push duplicate messages to same client.
23 // note this instance is only accessed when single connection to server arrives message, so no lock needed..
24 std::vector<server_msg_t> m_svrmsgs;
25 };
26 }
上面的是经过简化以后的代码,m_svrmsgs 成员存储的就是接收到的所有的后台消息,server_msg_t 代表的就是一个后台消息,appname、uid 用来定位发给哪个产品的哪个实例;msgid 用来唯一的标识一个消息;recv_first、recv_last、recv_cnt 分别表示消息接收的首次时间、最后时间以及重复接收次数。那么现在一个很现实的问题就是,我需要把这些消息序列化到永久存储上去,以便进程重启后这些信息还在。
