c++的静态反射与动态反射

动态反射,编译时多态可根据指针类型确定函数,见这里:

元<型名 F>用 值转=函数<空(F*f,常 串&名)>;
//每一项转值,成员项,都可转成指针,指与名对应.指针与&构::值对应

元<型名 T>类 段转基{
公:
  虚~段转基()=默认;
  虚 空 符号()(T*p)常=0;
};

元<型名 T,型名 F>
类 段转:公 段转基<T>{
 公:
  段转(常 串&名,F T::*指针,值转<F>f)
      :名(名),针(指针),z(f){}

  空 符号()(T*p)常 盖{中 z(&(p->*针),名);}
  //注册函数,然后实现,在这里
 私:
  串 名;F T::*针;值转<F>z;
 //&构::值=>名=>函数对应,这里,针和p(对象)在函数中相关联.
};

元<类 T>
类 构值转{//构,设定T,
  向量<独针<段转基<T>>>F_;
公:
  元<型名 F>
  空 注册字段(F T::*针,常 串&名,值转<F>z){
    F_.压后(造独<段转<T,F>>(名,针,移动(z)));
  }//注册的,
  空 符号()(T*p)常{对(动&f:F_)(*f)(p);}
  //这里调用,对外的两个函数
};

使用:

#包含"动态反射.h"

构 简单构{
  极 极_;整 整_;
  双精 双精_;串 串_;
};

整 主(){
  动 m=[](极*f,常 串&名){
    输出<<布尔真假<<名<<"[!串000]"<<*f<<行尾;
  };
  动 n=[](整*f,常 串&名){
    输出<<名<<"[!串001]"<<*f<<行尾;
  };
  动 o=[](双精*f,常 串&名){
    输出<<固定<<名<<"[!串002]"<<*f<<行尾;
  };
  动 l=[](串*f,常 串&名){
    输出<<名<<"[!串003]"<<*f<<行尾;
  };

  构值转<简单构>c;
  c.注册字段(&简单构::极_,"极",值转<极>(m));
  c.注册字段(&简单构::整_,"整",值转<整>(n));
  c.注册字段(&简单构::双精_,"双精",值转<双精>(o));
  c.注册字段(&简单构::串_,"串",值转<串>(l));
  //这是使用方法,太麻烦,要人工手写

  简单构 简单{真,2,2.0,"啊啊啊"};c(&简单);//使用0;

搞懂没?.下面是静态反射.

元<型名 F,型名 T,大小型...I>
内联 常式 空 每一元组(T&&t,F&&f,引序<I...>){
  用 大=整[];//就是对一个元组项调用.
  (空)大{0,((空)f(取<I>(前向<T>(t))),0)...};
}//这是每一元组,f,为对每一元组中项应用的函数,仔细观察

元<型名 F,型名 T>
内联 常式 空 每一元组(T&&t,F&&f){
  每一元组(前向<T>(t),f,造引序<元组大小<退化型<T>>::值>{});
}//可以另外换一种写法

元<型名 T>构 是针段:假型{};
元<型名 C,型名 T>构 是针段<T C::*>:真型{};
元<型名 T>常式 动 是针段值=是针段<T>::值;

元<型名 T>内联 常式 动 G(){中 造元组();}
#定义 定义概(构,...)\
  元<>内联 常式 动 G<构>(){\
    用 _构=构;中 造元组(__变长实参__);\//这里,加额外参数.
  }//这是一般情况,这个是构造,必须要有G<构>
//有哪些字段?
//_构,接力方式,让下个宏获取上个宏

#定义 定构段(f,n) 造元组(&_构::f,n)//用宏,不然,没法.
//字段,每个字段名字,这两个才是关键.造了个字段,与名字

元<型名 T,型名 F>
内联 常式 空 每一字段(T&&值,F&&f){//每一字段的f=>f(1,2)
  常式 动 g=G<退化型<T>>();
  静断(元组大小<推导(g)>::值!=0,"条件不对");
  每一元组(g,[&值,&f](动&&o){//这里o==>为前面的g.o为形参,g为实参
    用 m=退化型<推导(o)>;
    静断(元组大小<m>::值>=2&&是针段值<元组元素型<0,m>>,"条件不满足");
    //过滤,检查是否定义字段,是否包含位置和名称
    //指针字段是成员指针
    f(值.*(取<0>(前向<推导(o)>(o))),
      取<1>(前向<推导(o)>(o)));//这个f带两个参数
  });//这里推导出来了. //第1个是F

使用:

#包含"静反射.h"

构 简单构{
  极 极_;整 整_;双精 双精_;串 串_;
};

定义概(简单构,定构段(极_,"极"),定构段(整_,"整"),定构段(双精_,"双精"),定构段(串_,"串"));

构 仿函数{
  元<型名 F,型名 名>
  空 符号()(F&&f,名&&名){
    输出<<布尔真假<<固定<<名<<"啊啊"<<f<<行尾;
  }
};

元<类...B>构 重载集;
元<类 F,类...B>
构 重载集<F,B...>:F,重载集<B...>::型{
  又 重载集 型;//这里是为什么?,还没搞懂.要实验
  重载集(F t,B...w):F(t),重载集<B...>::型(w...){}
  用 F::符号();
  用 重载集<B...>::型::符号();//这应该是迭代,后面的,然后生成
};
元<类 F>构 重载集<F>:F{又 F 型;用 F::符号();};

元<类...F>
型名 重载集<F...>::型 重载(F...x){
  中 重载集<F...>(x...);//函数调用
}//()
整 主(){
  每一字段(简单构{真,1,1.0,"啊啊"},
   [](动&&f,动&&名){
     输出<<布尔真假<<固定<<名<<"啊啊"<<f<<行尾;
   });

  每一字段(简单构{真,1,1.0,"啊啊"},仿函数{});
  每一字段(简单构{真,1,1.0,"啊啊"},
   重载(
       [](极 f,常 符*名){输出<<"啊啊"<<f<<行尾;},
       [](整 f,常 符*名){输出<<"啊啊"<<f<<行尾;},
       [](双精 f,常 符*名){
         输出<<"啊啊"<<f<<行尾;
       },
       [](常 串&f,常 符*名){
         输出<<"啊啊"<<f.c串()<<行尾;
       }));
  中 0;
}

看懂没有,反正我也没大看懂.

元<型名 T>构 是可选:假型{};
元<型名 T>构 是可选<独针<T>>:真型{};
元<型名 T>常式 极 是可选值=是可选<退化型<T>>::值;
元<型名 T>
常式 极 有概要=元组大小<推导(构概要<T>())>::值;

元<型名 T>
构 依参查序化器<T,如允许型<有概要<T>>>{//奇怪的语法,在我这,通不过.
  元<型名 基型>静 空 到数格(基型&j,常 T&值){
    每一字段(值,[&j](动&&o,动&&名){j[名]=o;});//这里的f为带两个参数的
  }

  元<型名 基型>静 空 从数格(常 基型&j,T&值){
    每一字段(值,[&j](动&&o,动&&名){//两个参数.
      //忽略缺少的可选字段.
      如(是可选值<推导(o)>&&j.找(名)==j.尾())中;
      j.在(名).取到(o);
    });
  }
};

总之,实现类似前面的模板,借f,来解析元组.每一字段->变成每一元组,值得学习
本一个(每一字段,带两个参数,转变成每一元组,带一个参数).
搞懂了吗?,同志们?

posted @   zjh6  阅读(222)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示