我是靠谱客的博主 个性皮带,最近开发中收集的这篇文章主要介绍详解C++泛型装饰器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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(forward<decltype(hargs)>(hargs)...);
        return [f = std::move(tail)](auto &&...args) {
            return f(forward<decltype(args)>(args)...);
        };
    };
    auto nameWithAge = withDecorator(Object, Age, ObjectField("nic"));
    auto withDecoratorWithSex = withDecorator(nameWithAge, sex, AgeField(18));
    withDecoratorWithSex(SexField("man"));
}
int main() {
    DecoratorTest();
}

输出


对输出的解释

左值:表示传参的过程中调用了拷贝构造函数

右值:表示在传参过程中调用的是 移动构造函数

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注靠谱客的更多内容!

最后

以上就是个性皮带为你收集整理的详解C++泛型装饰器的全部内容,希望文章能够帮你解决详解C++泛型装饰器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部