用C++怎样写一个装饰器,方法是什么?
导读:这篇文章给大家分享的是用C++写一个装饰器,这里主要使用的是c++ lamda 表达式实现,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。 c++ 装饰器 本文简单写了个 c++ 装饰器,主要使用的是...
这篇文章给大家分享的是用C++写一个装饰器,这里主要使用的是c++ lamda 表达式实现,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
c++ 装饰器
本文简单写了个 c++ 装饰器,主要使用的是c++ lamda 表达式,结合完美转发技巧,在一定程度上提升性能
#define FieldSetter(name, type, field) \ type field; \ name() { } \ name(const type& field): field(field) { \ cout "[左值 " field "]" endl; \ } \ name(const type& & field) : field(move(field)){ \ cout "[右值 " field "]" endl; \ } \ name(const name& other) { \ field = other.field; \ cout "[左值 " other.field "]" endl; \ } \ name(const name& & other) { \ field = move(other.field); \ cout "[右值 " other.field "]" endl; \ } struct ObjectField { FieldSetter(ObjectField, string, name); } ; struct AgeField { FieldSetter(AgeField, int, age); } ; struct SexField { FieldSetter(SexField, string, sex); } ; void DecoratorTest() { auto Object = [](auto ob) { cout ob.name endl; } ; auto Age = [](auto age) { cout age.age endl; } ; auto sex = [](auto sex) { cout sex.sex endl; } ; auto withDecorator = [](auto & & head, auto & & tail, auto & & ...hargs) { head(forwarddecltype(hargs)> (hargs)...); return [f = std::move(tail)](auto & & ...args) { return f(forwarddecltype(args)> (args)...); } ; } ; auto nameWithAge = withDecorator(Object, Age, ObjectField("nic")); auto withDecoratorWithSex = withDecorator(nameWithAge, sex, AgeField(18)); withDecoratorWithSex(SexField("man")); } int main() { DecoratorTest(); }
输出
对输出的解释
左值:表示传参的过程中调用了拷贝构造函数
右值:表示在传参过程中调用的是 移动构造函数
总结
以上就是关于用c++ lamda写一个装饰器的介绍,上述示例具有一定的借鉴价值,有需要的朋友可以参考学习,希望对大家学习C++有帮助,想要了解更多可以继续浏览网络其他相关的文章。
文本转载自脚本之家
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 用C++怎样写一个装饰器,方法是什么?
本文地址: https://pptw.com/jishu/655268.html