详解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++泛型装饰器 的全部内容, 来源链接: utcz.com/p/247640.html

回到顶部