详解C++泛型装饰器

 更新时间:2021年11月16日 15:54:24   作者:Silent_Blue_Sky  
这篇文章主要为大家介绍了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();
}

输出

在这里插入图片描述

对输出的解释

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

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

总结

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

相关文章

  • Java C++题解leetcode915分割数组示例

    Java C++题解leetcode915分割数组示例

    这篇文章主要为大家介绍了Java C++题解leetcode915分割数组示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • C++函数对象详解附带实例

    C++函数对象详解附带实例

    这篇文章主要介绍了C++函数对象详解附带实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++实践排序函数模板项目的参考方法

    C++实践排序函数模板项目的参考方法

    今天小编就为大家分享一篇关于C++实践排序函数模板项目的参考方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C++中4种管理数据内存的方式总结

    C++中4种管理数据内存的方式总结

    根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储、静态存储和动态存储。在存在时间的长短方面,以这三种方式分配的数据对象各不相同。下面简要介绍这三种类型
    2022-09-09
  • 最大对称字符串的算法

    最大对称字符串的算法

    题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
    2013-03-03
  • C语言动态数组详解

    C语言动态数组详解

    本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下
    2021-09-09
  • C++访问注册表获取已安装软件信息列表示例代码

    C++访问注册表获取已安装软件信息列表示例代码

    这篇文章主要介绍了c++通过读取注册表获得本机已安装软件信息的方法,大家参考使用吧
    2013-11-11
  • 浅析C++字节对齐容易被忽略的两个问题

    浅析C++字节对齐容易被忽略的两个问题

    今天我就和大家分享一下C++字节对齐容易被忽略的两个问题。以下问题也是我实际开发工作中遇到的,如果有不同意见欢迎交流
    2013-07-07
  • C++第三方日志库Glog的安装与使用介绍

    C++第三方日志库Glog的安装与使用介绍

    这篇文章主要介绍了C++第三方日志库Glog的安装与使用介绍,本文配置所采用的环境为Visual Studio2017,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • C++实现与Lua相互调用的示例详解

    C++实现与Lua相互调用的示例详解

    这篇文章主要为大家详细介绍了C++实现与Lua相互调用的方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-03-03

最新评论