当前位置: 首页 > java >正文

C++ 模板工厂、支持任意参数代理、模板元编程

C++ 模板工厂、支持任意参数代理、模板元编程

  • 一、模板工厂
  • 二、支持任意参数代理
  • 三、模板元编程
    • 1.基本构建块​
    • 2.编译期 vs 运行时
    • 3.例子
      • 例子一
      • 例子二
      • 例子三


一、模板工厂

我们需要创建如下的类型,类型可能有很多个

struct TestObj1
{};struct TestObj2
{
public:TestObj2(){}TestObj2(int a,int b):a(a),b(b){}int a;int b;
};

我们可以用如下模板创建,但是有个弊端,我们无法为创建的对象进行赋值

template<typename T>
T* CreateObject()
{return new T();
}

让我们改进一下
如下图,我们使用可变参数实现了不同遍历的赋值操作,但是每次赋值都会产生拷贝,我们继续优化

template<typename T,typename ...ParamTypes>
T* CreateObject(ParamTypes&&...Param)
{return new T(Param...);
}

使用 #include <type_traits> 下的forward函数,避免拷贝

template<typename T,typename ...ParamTypes>
T* CreateObject(ParamTypes&&...Param)
{return new T(std::forward<ParamTypes>(Param)...);
}

二、支持任意参数代理

代理或者委托就是对函数指针的一种封装

  • 需要有调用的实例
  • 执行调用的函数指针
  • 重载()调用委托
template<typename TObjectType,typename TReturn,typename ...ParamTypes>
class FDelegate
{
public:FDelegate(TObjectType* InObject, TReturn(TObjectType::* InFunction)(ParamTypes...)):Object(InObject), Function(InFunction){}TReturn operator()(ParamTypes&&...Param){return (Object->*Function)(std::forward<ParamTypes>(Param)...);}public:TObjectType* Object;TReturn(TObjectType::* Function)(ParamTypes...);
};template<typename TObjectType, typename TReturn, typename ...ParamTypes>
FDelegate<TObjectType, TReturn, ParamTypes...> CreateDelegate(TObjectType* InObject, TReturn(TObjectType::* InFunction)(ParamTypes...))
{return FDelegate<TObjectType, TReturn, ParamTypes...>(InObject, InFunction);
}

使用如下

    DelegateStruct* ds = new DelegateStruct();auto delegate = CreateDelegate(ds, &DelegateStruct::TestFunc);int sum = delegate(1, 2);std::cout << sum << std::endl;

如下是对核心语法 (Object->*Function)(std::forward<>(Param)…) 的解析
在这里插入图片描述
为什么要这样设计:
在这里插入图片描述

三、模板元编程

模板元编程(Template Metaprogramming,简称TMP)是C++的一项强大技术,利用模板系统在​​编译期​​进行计算、生成代码和执行逻辑。它在现代C++开发中扮演着关键角色。

1.基本构建块​

  • 类型计算​​:typedef, using别名
  • 值计算​​:static constexpr成员
  • ​​模式匹配​​:模板特化与偏特化
  • 递归实例化​​:模板递归调用

2.编译期 vs 运行时

在这里插入图片描述

3.例子

例子一

定义:

template<class T,T t>
struct FConstTest
{static constexpr T Value = t;
};

使用:

    int value1 = FConstTest<int, 10>::Value;std::cout << value1 << std::endl;

例子二

定义:

template<int value1,int value2>
struct FConstTest1
{static constexpr int Value = value1 + value2;
};

使用:

    int value2 = FConstTest1<10, 20>::Value;std::cout << value2 << std::endl;

例子三

定义:

template<class T,T t>
struct FConstTest
{static constexpr T Value = t;
};template<bool v>
using bool_temp = FConstTest<bool, v>;template<class , class>
constexpr bool isSame_V = false;template<class T>
constexpr bool isSame_V<T, T> = true;template<class T1,class T2>
struct isSame : bool_temp<isSame_V<T1,T2>>{};

使用:

    bool b1 = isSame<int, int>::Value;std::cout << b1 << std::endl;bool b2 = isSame<int, float>::Value;std::cout << b2 << std::endl;
http://www.xdnf.cn/news/15204.html

相关文章:

  • 科技驯服烈日狂沙:中东沙漠农场的光储革命
  • 开发AI Agent到底用什么框架——LangGraph VS. LlamaIndex,一文看懂!
  • 使用Java完成下面程序
  • docker 443错误 lookup docker.mirrors.ustc.edu.cn: no such host
  • CCF CSP第一轮认证一本通
  • 深度学习-卷积化
  • 【离线数仓项目】——电商域DWD层开发实战
  • 【C++小白逆袭】内存管理从崩溃到精通的秘籍
  • EPLAN 电气制图(七):电缆设计全攻略
  • 【设计模式】外观模式(门面模式)
  • 人工智能安全基础复习用:可解释性
  • NestJS 系列教程(五):守卫(Guards)与 JWT 用户认证
  • 【Elasticsearch】post_filter
  • 代码审计-Struts2漏洞分析
  • java进阶(一)+学习笔记
  • 【嵌入式】51单片机学习笔记-Keil5软件安装教程
  • 【6.1.3 漫画分布式锁】
  • 算法魅力-BFS解决最短路问题
  • Android音视频探索之旅 | C++层使用OpenGL ES实现视频渲染
  • 【文献阅读】DEPTH PRO: SHARP MONOCULAR METRIC DEPTH IN LESS THAN A SECOND
  • AI:机器人行业发展现状
  • 【软件测试面试】面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......
  • PyVision:基于动态工具的具身智能体
  • linux学习第30天(线程同步和锁)
  • 【世纪龙科技】比亚迪新能源汽车结构原理体感教学软件
  • 从零到一:企业如何组建安全团队
  • CSS选择器进行定位
  • 医疗AI前端开发中的常见问题分析和解决方法
  • 计算机视觉与深度学习 | 基于Matlab的多特征融合可视化指纹识别系统(附完整代码)
  • 电脑上如何查看WiFi密码