一个好用的短信发送的客户端

背景

最近需要做一个登录短信验证的功能,看了不少短信平台,对于c++接口的支持不友好,有的甚至没有,有的是通过curl去实现的,还是同步的,比较难用。于是就基于boost.asio用c++17实现了一个异步的短信发送客户端, 非常好用,只有一个发送短信的接口。
现在工程中的例子是以云片短信平台为例子的,你可以很容易修改为其他的短信平台。

特点

sms_client的主要特点:

  1. header only
  2. async
  3. easy to use

快速示例

一个header only的c++ 日志库

背景

NanoLog是一个非常小巧的log库,代码很少,不到一千行,速度比spdlog还快,应用上也能满足需求,我很喜欢。但是也存在一些不足,比如日志文件的数量没有限制,每次重启之后会从头开始写等等问题,还需要进一步完善。于是我新建了一个工程nanolog,这个工程继承于nanolog,将原工程改成header only,并用了一些最新的特性来简化原来的代码。

快速示例

如何编译

由于使用了C++17的新特性,所以需要支持C++17的编译器,gcc7.2,vs2017 15.5

roadmap

  1. 增加文件数量上限
  2. 重新写日志从上次的位置继续写

运行期的tuple get

运行期的tuple get

背景

通过索引来访问tuple的元素可以通过std::get(tuple)实现,不过这个I必须是编译期常量,能否通过运行期的一个索引来访问tuple的元素呢?
刚好最近有这个需求,用C++17的fold expression可以比较容易实现根据运行期索引来访问tuple的元素。

实现

根据运行期索引访问tuple

测试代码:

将打印第二个元素。

我们可以用hack一点的写法来提高效率:

这种写法一行代码实现,不需要再多写一个子函数了。fold expression的时候通过一个bool表达式来控制是否调用函数,不是每次都进入调用函数,只有在条件满足的时候才进入,之前的写法是每次都会进入子函数,在子函数中做判断是否调用目标函数。这种写法效率更高。

性能比较

visit的第二种写法效率比第一种写法效率高了2-2.5倍,应该是编译器对这种写法做了优化。下面是测试代码:

输出时间: