用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
