首页后端开发其他后端知识用C++怎样写一个装饰器,方法是什么?

用C++怎样写一个装饰器,方法是什么?

时间2024-03-28 23:26:03发布访客分类其他后端知识浏览1000
导读:这篇文章给大家分享的是用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
C语言sprintf函数怎样使用,与fprintf和printf不同在哪? 用C语言怎样做桶排序,方法和过程是什么?

游客 回复需填写必要信息