网站建设属于什么合同,网站托管好吗,宁波网站优化公司价格,东莞市住建局网设计模式工厂 通过工程来构建任意参数对象std::forwardstd::move 在C中#xff0c;“工厂”#xff08;Factory#xff09;是一种设计模式#xff0c;它提供了一种创建对象的方式#xff0c;将对象的创建和使用代码分离开来#xff0c;提高了代码的可扩展性和可… 设计模式工厂 通过工程来构建任意参数对象std::forwardstd::move 在C中“工厂”Factory是一种设计模式它提供了一种创建对象的方式将对象的创建和使用代码分离开来提高了代码的可扩展性和可维护性。 工厂模式通过一个共同的接口或基类来定义产品对象的创建方法而具体的对象创建过程则由子类或具体工厂来实现。通过使用工厂模式我们可以隐藏对象的创建细节使客户端代码只关心使用对象而不必关心对象的创建方式。
工厂模式常见的几种变体包括 简单工厂模式Simple Factory由一个工厂类负责创建所有的产品对象根据不同的传入参数返回不同的产品实例。 工厂方法模式Factory Method通过定义一个创建对象的接口让子类决定实例化哪个类。每个具体子类都对应一个具体产品。 抽象工厂模式Abstract Factory提供一个创建相关或依赖对象族的接口而无需指定具体类。不同的具体工厂类可以创建不同类别的产品对象。
工厂模式在实际开发中常用于
封装对象的具体创建过程隐藏对象的实现细节实现创建对象的灵活性方便根据需求变化创建不同的对象遵循开闭原则提高代码的可扩展性和可维护性。
需要注意的是工厂模式并不是万能的适用于需要创建复杂对象、对象创建过程涉及多个步骤或对象创建涉及多个类的情况。对于简单的对象创建直接使用构造函数就足够了。
通过工程来构建任意参数对象 advanced.h #pragma once
#include iostream
#include type_traits
using namespace std;
//定义
templateint ...//定义一个接受任意数量整数参数的模板函数
struct HelloIndex
{};//通过using展开的中间值
templateint N, int ...ParamTypes
struct SpawnIndex
{using Type typename SpawnIndexN - 1, N - 1, ParamTypes...::Type;//typename 来明确告诉编译器该名称是类型而不是值
};//循环终止
templateint ... ParamTypes
struct SpawnIndex0, ParamTypes ...
{typedef HelloIndexParamTypes...Type;
};//工厂
templateclass T
T* CreateObject()//创建一个无参的T对象的工厂函数
{return new T();
}templateclass T, class Arg0
T* CreateObject()//创建一个带一个参数的T对象的工厂函数
{return new T(Arg0);
}templateclass T,class Arg1,class Arg2
T* CreateObject()
{return new T(Arg1, Arg2);
}//改变为可变参数可以大大节省了代码量(和上面相比)
templateclass T, class ...ParamTypes
T* CreateObject(ParamTypes ...Param)//创建一个可变参数的T对象的工厂函数可以接受任意数量的参数
{//return new T(Param...);//会产生一个拷贝下面代码不会产生拷贝return new T(std::forwardParamTypes(Param)...);//使用std::forward将参数引用传递给T对象的构造函数并返回创建的对象的指针//这样可以避免产生不必要的拷贝
}学习.cpp #include iostream
#includeadvanced.hstruct FTestA
{};struct FTestB
{FTestB(int a, int b){}
};int main()
{SpawnIndex10::Type* Hello CreateObjectSpawnIndex10::Type();//using Hello CreateObjectSpawnIndex10::Type();if (Hello){}FTestA* p CreateObjectFTestA();FTestB* p2 CreateObjectFTestB(1,2);return 0;
}折叠 可以看作是引用的引用 表示右值引用rvalue reference。它是C11引入的一种新的引用类型用于支持移动语义和完美转发
在C17中引入了参数包展开的语法使得对模板参数包parameter pack的操作更加便捷和灵活。其中参数包展开支持对右值引用的折叠rvalue reference collapsing即将多个右值引用折叠为一个右值引用
std::forward
https://www.cnblogs.com/oniisan/p/moveFunction.html 用在泛型代码中进行完美转发 完美转换传入左值把左值引用传递传入右值把右值引用传递通过此方式避免拷贝
头文件 #include type_traits
std::move
左值或右值都转换为右值引用
头文件 #include type_traits