Metaprogram 对一个程序进行编程
metaprogram含有对一个程序进行编程的意思,换句话说,编程系统将会执行我们所写的代码,来生成新的代码,而这些新的代码才真正实现了我们所期望的功能,通常而言,metaprogram 这个概念意味着一种反射的特性,metaprogram组件只是程序的一部分,而且它只生成一部分代码或者程序。
我们为什么需要metaprogram 呢?和大多数程序设计一样,使用metaprogram的目的是为了实现更多的功能,并且使话费的开销更小,其中开销是以,代码大小,维护的开销等来衡量的,另一方面。metaprogram 的最大特点在于,某些用户自定义的计算可以在程序翻译期间志兴,而这通常能够在性能或者接口简单方面带来好处,甚至为两方面同时带来好处。
metaprogram 要依赖于我们在第15章所介绍的关于trait 和类型函数的概念。
1 metaprogram的第一个实例
在1994年C++标准一次会议上,Erwin Unruh提出了,可以使用模版来编译期进行一些计算,于是,他写了一个用于产生素数的程序,其中特别的是,生成素数的计算是编译器在编译期执行的,而不是在运行期执行的,而且对于从2到某个可配置的值,编译器都会产生一个错误信息,最后,尽管这个程序并不是严格的可移植的,但是该程序表明了,模版实例化机制是一种基本的递归语言机制,可以用于在编译器执行复杂的计算。
在深入了解metaprogram细节之前,看一个简单的例子。
#ifndef POW3_HPP
#define POW3_HPP
//用于计算3的N次方的基本模版
template<int N>
Class Pow3 {
Public:
enum {result = 3 * Pow3<N-1>::result};
}
//用于结束递归的全局特化
template<>
Class Pow3<0> {
public:
enum {result = 1};
};
#endif
实际上,在template metaprogram后面所做的工作是递归的模版实例化,在这个计算3^N的递归模版实例化应用下面的这两个规则
3^N = 3 * 3 ^N -1
2 3^0 = 1
#pragma once
template<int N>
class Pow3
{
public:
enum {result = 3*Pow3<N-1>::result};
};
//
template<>
class Pow3<0> {
public:
enum {result = 1};
};
Pow3<7>::result = 2187
root@bms-capitaland-g6v2-app-10-131-121-78:/data/demos#
root@bms-capitaland-g6v2-app-10-131-121-78:/data/demos#
root@bms-capitaland-g6v2-app-10-131-121-78:/data/demos# cat mee.cc
#include <iostream>
#include "meta.hpp"
int main()
{
std::cout<<"Pow3<7>::result = " << Pow3<7>::result << '\n';
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/392030.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!相关文章:

Metaprogram 对一个程序进行编程
metaprogram含有对一个程序进行编程的意思,换句话说,编程系统将会执行我们所写的代码,来生成新的代码,而这些新的代码才真正实现了我们所期望的功能,通常而言,metaprogram 这个概念意味着一种反射的特性&am…...

【测开篇】测试基础
文章目录名词解释:1. 什么是需求?2. 什么是Bug?3. 什么是测试用例?软件的生命周期开发模型1. 瀑布模型2. 螺旋模型3. 增量模型和迭代模型4. 敏捷模型测试模型1. V模型2. W模型软件测试的生命周期Bug如何描述一个Bug?Bu…...

力扣第331场周赛题解
rankT1T2T3T4331 / 42560:01:460:06:18 (1)0:11:580:57:29 (4) T1 从数量最多的堆取走礼物模拟题,每次操作找出最大值maxxmaxxmaxx并将其变成sqrt(maxx)sqrt(maxx)sqrt(maxx),kkk次操作后求和。 数据范围很小,可以暴力模拟,更好的…...

基于LDA模型的非监督分类算法介绍
前言基于LDA(Latent Dirichlet Allocation)模型的非监督分类算法,将LDA模型从文本分析的应用过渡到遥感高分辨率影像处理的应用,利用Gibbs采样方法设计基于LDA模型的非监督分类算法,并使用IDL语言实现。在一定程度上解…...

以安全有效为目标的综合运营
一、安全行业的现状所有做安全的方案大多会在开始介绍安全的案例,都会列举近期国内外发生的重大安全事件, 基本上都是惨不忍睹,危害巨大。这里就不一一列举了,稍微了解这个行业的人都能看到大量的案例。但业界又有个很奇怪的现象就…...

mysql常见面试题--03 事务常考题以及事务的隔离
什么是事务? 对数据库的一系列操作,要么全执行,要么不执行. 事务时逻辑上的一组操作,要么全部执行,要么都不执行。 事务的三大特征 原子性 A 事务是最小执行单位,要么全部执行,要么都不执行一致性 C 事务执行前后&…...

【推荐研究方向(1)】小样本开集目标检测(few-shot open-set detection)
论文题目:Towards Few-Shot Open-Set Object Detection 论文链接:https://arxiv.org/abs/2210.15996 1、任务:小样本开集目标检测,使用少量已知类样本训练模型,使得模型既能够检测小样本已知类又能够检测未知类。 2、动机:解决FSOSOD问题有三个重要原因。 1)可…...

细讲TCP三次握手四次挥手(四)
常见面试题 为什么TCP连接的时候是3次?2次不可以吗? 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…...

道路病害识别监测系统 CNN网络
道路病害识别监测系统通过CNN网络深度学习算法,道路病害识别监测对巡检车上实时监控道路影像数据进行分析,输出道路病害裂缝巡检报告并落图展示。在CNN出现之前,对于图像的处理一直都是一个很大的问题,一方面因为图像处理的数据量…...

chromium ARM版本编译记录
需求用的国产电脑,统信麒麟自带的chromium版本都是83版本,lceda要求超过100版本,低版本没法打开编辑器,只能用客户端版本。都是JS,还整这么多事...刚开始想着一步到位直接在阿里云香港主机上买高配置的竞价虚拟机,结果…...

C++函数模板5分钟入门教程
为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示: //交换 int 变量的值 void Swap(int *a, int *b){ int temp *a; *a *b; *b temp; }//交换 float 变量的值 void Swap(float *a, float *b)…...

[BJDCTF2020]Easy MD5
[BJDCTF2020]Easy MD5 进入靶场: 只有一个输入框,先看看源码… 好像没啥东西 看一眼数据包。 Response Header中有一个hint 是一个SQL语句,看来是一个SQL注入 select * from admin where passwordmd5($pass,true):只需要将…...

Kubernetes那点事儿——Pod原理剖析
Kubernetes那点事儿——Pod原理剖析前言1、为什么需要Pod2、Pod的实现原理3、Pod设计应用前言 众所周知,Pod是K8s的原子调度单位,是 K8s 能够描述和编排各种复杂应用的基石。 1、为什么需要Pod 为什么需要Pod,或者K8s为什么要讲Pod作为最小调…...

TCC真没这么简单,一文讲透|分布式事务系列(三)
本文从两个场景说起,详细描述了TCC的详细过程,以及对比2PC有什么区别,适用什么样的场景。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达在面试前复习 TCC 的时候你是不是这样做的:百度TCC关…...

git如何解决冲突?
git如何解决冲突? 一、什么情况下会产生冲突? 当多个开发者同时使用或者操作 git 中的同一个文件时: 多个分支代码合并到一个分支;多个分支向同一个远端分支推送代码; push操作的本质就是将本地代码merge到远端分支…...

html页面跳转到对应id的tab标签页
页面一(点击进行跳转的页面): 页面二(跳转的目标页面): 获取跳转的路径: var url location.href; 截取当前跳转路径的id: var sid url.split(".html&quo…...

改变input的placeholder颜色
.el-input /deep/ .el-input__inner::-webkit-input-placeholder{color:#000000;}...

v-if 和v-show 的区别
1、v-if 当条件为false时,包含v-if指令的元素,不会存在于DOM中 1、v-show 当条件为false时,v-show只是给元素添加了一个行内样式 display:none ,元素仍存在于DOM中。...

v-on 的参数传递和修饰符
一、v-on的参数传递 <button click"clickBtn1"></button> 如果在定义事件时没有加小括号,但是方法本身又需要一个参数时,vue会默认将浏览器生成的event事件对象作为参数传递到方法。 如果在定义方法时,既需要event对…...