所有由qicosmos发布的文章

解耦利器function message bus

需求1

能把模版函数和一个key注册起来以便后面使用,能把参数不同的函数和一个key注册起来以便后面使用。
c++中没有这样的一个容器可以存放模版函数和参数类型不同的函数。

需求2

对象A和对象B相互调用,耦合性很强,如何消除这种耦合性;
对象A和对象B没有任何关系,但A希望用B里面的方法,但二者又不适合直接关联起来。

如果你碰到这两个需求中的任何一个,那么你就需要function message bus。

作用

1.作为一个万能的函数注册器,可以注册任意类型的函数(除了重载函数);

2.解耦对象之间的调用关系

例子

上面的例子展示了如何注册不同类型的函数,包括普通(模版)函数,lambda和成员函数,也支持函数返回值。

因为函数的调用者不必知道被调用者,二者都依赖于function_msg_bus,所以你就可以通过它来解耦对象之间的调用关系。

具体代码

github

purecpp社区将举办今年的C++大会(讲师报名已经开始)

大会目标

Modern C++开源社区purecpp将举办今年的C++大会,目前正在筹备当中。举办C++大会的目的是为了促进行业交流,推广和促进modern c++为企业提高生产力和竞争力。

purecpp社区创始人祁宇作为大会的技术出品人(他也将在今年的cppcon上做演讲),负责招募国内外的优秀讲师。这将是purecpp社区组织举办的一场高水平、国际化的C++大会,大会的形式和内容将会与cppcon类似但又具备中国特色,如果你不能亲自前往美国参加cppcon那么就不要错过这次在中国举行的C++大会。

时间和地点

2018-11月或2018-12月,晚点确定最终时间

深证,广州,珠海三地之一,晚点确定最终地点

赞助商

这是开源社区组织的C++大会,不以盈利为目的,因此需要寻求赞助商。有意成为赞助商的请邮件purecpp@163.com

白金赞助商 16w(仅限一名)
1. 赞助商logo和链接放到官网
2. 开幕和闭幕上致谢
3. 提供两个展位
4. 可以在主会场打两个广告条幅
5. 大会宣传册上放赞助商logo

黄金赞助商 8w
1. 赞助商logo和链接放到官网
2. 开幕和闭幕上致谢
3. 提供一个展位
4. 大会宣传册上放赞助商logo

白银赞助商 4w
1. 赞助商logo和链接放到官网
2. 开幕和闭幕上致谢
3. 大会宣传册上放赞助商logo

青铜赞助商 2w
1. 赞助商logo和链接放到官网
2. 开幕和闭幕上致谢

大会主题

  1. C++11/14/17/20
  2. C++ libraries and frameworks of general interest
  3. ISO standardization proposals
  4. Parallelism/multi-processing
  5. Concepts and generic programming
  6. Functional programming
  7. High performance computing
  8. Software development tools, techniques, and processes for C++
  9. Practical experiences using C++ in real-world applications
  10. Industry-specific perspectives: mobile and embedded systems, game development, high performance trading, scientific programming, robotics, etc.

讲师报名

不管你是什么学历、什么公司、什么国家,只要你有和C++有关的创新的idea,你就可以报名!
讲师报名需要填一个报名表,类似于cppcon,你需要提供演讲者的信息、演讲的摘要信息和主要内容。如果你有很有说服力的证明材料就更好了,证明材料是能证明你演讲内容的代码或之前的ppt。

讲师报名阶段两个月左右,报名阶段结束之后就是评审阶段。采取的是专家评审方式,由两名中国专家和两名外国专家对演讲内容进行评审,评审通过的讲师就可以参会了。无论评审通过与否我们都会告知报名者结果。

这次大会对讲师的质量会要求很高,竞争也会比较激烈,因此填一份好的讲师报名表很重要。

希望中国的C++高手和天才们赶紧报名成为讲师,中国的C++大会将因你而不同!

中国C++大会讲师报名表

cppcon2018将于九月在贝尔维尤举办

cppcon2018

由C++标准委员会组织的顶级C++技术大会cppcon2018将于9月在bellevue举办,C++之父Bjarne Stroustrup和C++标准委员会主席Herb Sutter将在大会上做主旨演讲。来自全球数十个国家的C++专家将在大会上做精彩的演讲,国际各大知名公司也将参会。

今年的cppcon竞争非常激烈,报名的演讲主题有两百多个,最终只有一百多个主题被接受。相信今年的cppcon将是一场C++技术盛宴。随着C++17的确定和C++20的到来,今年势必会涌现出更多的新思想和新技术,非常令人期待。

purecpp社区创始人祁宇也将在这次大会上做演讲,这是他连续两年参加cppcon,在此也希望有更多的来自中国的C++爱好者能在C++国际舞台上发出自己的声音。

purecpp社区将持续关注cppcon2018技术大会的最新资讯并及时与大家分享。

欢迎关注purecpp社区的微信公众号。
qrcode_for_gh_300922997283_430

再谈自动注册的工厂

关于自动注册的工厂,我之前写过了两篇文章,之前的一篇文章在这里。这个自动注册的工厂通过宏实现自动注册,同时也可以支持变参。

下面是通过宏实现自动注册的例子。

之前提到的自动注册的工厂

问题

通过宏实现的自动注册工厂的主要问题就是需要借助宏,宏有两个问题,第一个问题是不能调试,第二个问题是让代码变得晦涩。这些自动注册的宏散落在各处,也增加了维护负担。如果能不借助宏实现自动注册就可以消除这些问题了。

改进目标

之前的自动注册工厂还需要改进,改进的目标就是消除宏。

实现

实现代码很简单,主要思路是借助crtp和静态变量初始化顺序来实现的,因为静态变量的实例化是早于main函数的,因此我们可以利用静态变量实例化的时候实现自动注册。

创建的对象需要派生于AutoMsgFactory,并实现一个静态的id函数,这个id就是创建该类型对象需要的一个唯一的id。需要注意的一个细节是:在id函数中需要使用一下基类AutoMsgFactory中的静态变量registered_,用来保证静态变量实例化。

assert(registered_);

上面这行代码在这里有两个作用,第一个作用是调用了registered_保证当前类会被自动注册,第二个作用是避免重复注册,出现重复注册时会触发断言错误。

另外通过编译期限定派生类必须定义一个Id函数可以保证派生类不会忘记定义创建该类需要的唯一id,这个id是自定义的,可以是枚举类型也可以是整形。

总结

这个实现消除了宏,在使用上也比较方便,不过也有个缺点是需要调用一下静态变量。综合来看,个人感觉比通过宏实现自动注册更好。

更新 支持变参

编译期遍历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发布新版本

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 “