feather以及ormpp linux依赖库的安装

Debian分支的linux下
1.安装mysql开发库 sudo apt-get install libmysqlclient-dev
2.安装postgresql开发库 sudo apt-get install libpq-dev
3.安装sqlite3开发库 sudo apt-get install libsqlite3-dev
4.安装uuid库 sudo apt-get install uuid
5.安装zlib库 sudo apt-get install zlib1g-dev
6.安装openssl库 sudo apt-get install libssl-dev

Centos下依赖安装 (建议centos7.0+)
1.安装mysql开发库 sudo yum install mysql-devel
2.安装postgresql开发库 sudo yum install postgresql-devel.x86_64
3.安装sqlite3开发库 sudo yum install sqlite-devel.x86_64
4.安装uuid库 sudo yum install libuuid-devel.x86_64
5.安装zlib库 sudo yum install zlib-devel.x86_64
6.安装openssl库 sudo yum install openssl-devel.x86_64

asio库的依赖安装
如果不想安装使用完整boost 可以只安装asio模块 这是官方下载地址http://think-async.com/Asio/AsioStandalone
如果使用的是ubuntu18.0系统的 可以直接通过命令安装最新的boost sudo apt-get install boost
boost安装方法如下
https://www.boost.org/下载最新的boost库
tar xvf 解压后 进入相应目录执行
1 ./bootstrap.sh
2 ./b2 –without-python
等待编译完成后 执行 sudo ./b2 install
成功执行以上步骤就完成了boost库的安装

如果只需要使用cinatra框架 只需要安装zlib ssl uuid boost.asio即可正常通过编译

编译期遍历std::array

需求

在编译期遍历一个std::array,并且保证遍历的索引为编译期常量。

实现代码:

如何实现函数参数过滤代码点评

前面提出了一个参数过滤的需求,社区的一些朋友给出了实现,在这里做一下点评。

需求

过滤传入的函数参数。假设传入了int, bool, double, bool, structA这几个参数,现在我需要把其中的bool参数去掉,只保留非bool的参数,因此输入的参数经过过滤之后就变成一个tuple<int, double, structA>了。

实现思路:

实现方法有两种(当然,也许还有更多的方法)。

第一种思路

展开变参的过程中忽略特定类型,其它类型的参数重新组成一个tuple,这种方法比较直接了当。社区的Jaly就是这样做的,下面是他的实现代码:

这个代码的实现简洁又灵活,代码很少,并且能支持任意类型的过滤,非常精彩。

除了上面的实现之外,还有一种实现方法,利用c++17的fold expression去过滤,这也是我的实现方法。具体代码如下:

这个实现相比Jaly的实现,代码更多,还不够灵活,不能对任意类型进行过滤。虽然用到了C++17的fold expression,但是没有Jaly的实现那么简洁灵活,而且还用到了运算符重载,存在运算符重载冲突的可能性。算是展示fold expression的一种用法吧。

社区的yiShuiHanFeng实现了过滤bool参数并调用过滤bool后的目标函数,下面是他的实现:

yiShuiHanFeng是通过函数递归调用来过滤bool的,但是他在过滤bool的同时又把需要的参数保留,通过不断把非bool的参数往后放来实现的,最终实现目标函数调用,中间不会生成中间变量,实现得非常精妙,很赞!

第二种思路

在编译期得到过滤之后的参数索引。展开参数类型,排除bool类型,并把非bool类型的参数索引保存到index_sequence,后面根据这个index_sequence就可以得到过滤后的参数。下面是fesil的实现:

这个实现也很棒,也能对任意类型进行过滤,实现用到了c++17的if constexpr,让代码变得更简单了,虽然相比第一种实现方法稍显复杂一点,但仍然是一个不错的思路。

总结

这个需求大家积极参与并且给出了精彩的实现,非常好。可以看到同一个需求却有着不同的实现思路和实现方法,体现了元编程灵活与精巧。

本次实现得最好的是Jaly,他的代码最短又灵活,其次是fesil,yiShuiHanFeng的参数移动也很精妙。

cinatra模板引擎使用

渲染一个简单的html模板

通过render_view这个接口 第一个参数是模板文件的相对路径 这样我们就可以给客户端返回一个html页面了

在当前模板中包含其他的模板文件
我们有一个test.html 和一个header.html 内容分别如下

服务器代码如下

这样我们就可以在业务中复用公用的模板文件 通过不同的数据去渲染想展示的内容

需要通过数据去渲染的页面
我们有一个data.html的文件 内容如下

如上使用 就能轻松的通过需要的数据渲染出一个页面

通常我们展示前端页面的时候都会需要对一个list的数据进行渲染 同样cinatra的模板也支持我们开发相关的业务
我们有一个list.html的文件,内容如下

我们可以在cinatra里面写上这么一个接口

是不是很轻松的就能完成我们的业务了

cinatra模板引擎同样支持if判断
我们有一个study.html的文件,内容如下

我们可以通过传递display=0或者1来看内容是否显示

以上列举了一些cinatra中常用的一些方法 更多的功能 大家可以在cinatra群里面一起交流学习

cinatra发布新版本

cinatra发布v0.04版本

这仍然是一个预发布版本,增加了一些有用的功能和改进了接口的易用性,欢迎大家试用!

modern c++做web开发给你飞一般的感觉!

最近改进的几个地方

cinatra本次改进增加了http缓存和更友好的html渲染接口:

示例

1.http缓存

这样就可以实现缓存了,这里设置的是全局缓存,即所有的http get请求都会缓存。

如果希望某些请求不缓存该怎么做呢?设置一个enable_cache参数即可:

这样就可以实现某个请求不缓存,除此之外的缓存。

2. 更友好的html渲染接口

如何实现函数参数过滤

需求

过滤传入的函数参数。假设传入了int, bool, double, bool, structA这几个参数,现在我需要把其中的bool参数去掉,只保留非bool的参数,因此输入的参数经过过滤之后就变成int, double, structA了。

如何实现这个需求,请大家把实现的代码发在文后,看看谁实现得最好,期待精妙的代码。

注意

评论的时候展示代码的话需要用一个代码格式,否则显示不正常,要类似于这样在代码外面套一个脚本:

pre class=”lang:c++ decode:true “

cinatra最新的改进

最近改进的几个地方

cinatra本次改进主要侧重于易用性和灵活性,主要增加了下面几项功能:

  1. response时自动添加对应的mime type
  2. 支持中文
  3. 内置小的静态资源获取
  4. 支持pathinfo/*

示例

1.response时设置mime type

2.中文

3.pathinfo

4.静态资源获取

purecpp社区寻求赞助和捐赠

purecpp社区的朋友们:

非常感谢大家对purecpp社区的热爱和支持,你们的支持对于purecpp社区很重要,对于modern c++很重要。

近来频繁出现了社区网站挂掉的情况,主要原因是在云主机有限的配置下资源占用过大导致的。由于社区现在是基于wordpress(php)改造的,所以性能和并发量非常有限,因此我计划将社区网站从php更换为c++的feather,feather的性能是php的数十倍,相信社区更换为feather之后,在相同资源的情况下,能够在很长一段时间内满足使用需求。

除了更换社区框架之外还需要对云主机进行升级,需要购买新的云主机,因此需要大家赞助或捐赠,金额不限,只要能维持社区网站的正常运行即可。捐赠者名单和金额也将在社区定期公布,当然如果你不希望公布自己的捐赠信息可以在捐赠的时候注明一下。

捐赠方式:微信和支付宝
微信:
weixin

支付宝:
zfb