首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ Trick:宏函数与模板类之殇

g++错误信息如下: map_m.cpp:13:34: 错误:宏“DECLARE”传递了 3 个参数,但只需要 2 个 DECLARE(map, msi);...原因是宏函数DECLARE接收两个参数,而如果把map传入,那么编译器预处理会把map里的逗号视作宏函数的分隔符,也就是拿到了三个参数: map<string int> msi 尽管前面两个是语义无法解释的...,但是在宏函数参数个数校验的环节就失败了。...也许你说,我根本不会定义一个DECLARE这样的宏函数(或者说函数宏)。类似的需求也可以用模板函数来实现。当然,我这里只是举例子,这个例子是基于我之前工作中遇到的一个代码场景简化后的demo。...但是我相信你可能有机会接触到类似接口的宏函数,使用的时候慎重就可以了。

65220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    寻找消失的类名

    实际上他已经提示你了,这个类的真实类名是 cn.com.chinatelecom.gateway.lib.a 本以为事情就这么过去了,谁知道没过两天,在一个夜黑风高的的晚上,我也遇到了这个问题。...二、步骤 类名是奇怪字符 老江湖也遇到新问题了,这个类名是什么鬼? 图片 1:step1 现在的App太不讲武德了,混淆我也就忍了,搞出个鬼画符,是什么操作?...查了一下js文档,有个 encodeURIComponent() 函数,可以把这种鬼画符通过 UTF-8 编码的转义 然后打印出来。 但是这个类名的转义字符是啥呢?...遍历之 我们可以找个取巧的方式,把这个包下的类都遍历出来,这样不就可以知道这个类名的UTF-8 编码的转义了吗?...%DB%A4%DB%A4%DB%9F%DB%A6')); 这次frida就不抱怨找不到类名了。 成员函数名 找到了类名当然不是我们的目的,我们的目的是星辰大海,哦不,是hook成员函数呀。

    1K30

    Java-“this”和“类名.this”以及“类名.class”的区分和详解

    引言: 对于以上三个语法结构的区分,需要先理解Class类 所有对象的类以及调用了静态方法的类都需要在对象创建之前在JVM虚拟机中加载,加载内容被称为“类对象”,每个类的类对象是唯一且是不可变的。...; 介绍完以上三种方法,不仅知道了得到Clas对象的方法,也知道了类名.class是什么意思了,其就是返回类名所对应的唯一类对象。...newInstance() 此方法用于返回一个类对象的实例,实例构造只能无参构造器,且为弱类型(即Object类型)。...类名.this : 类名.this一般用于内部类调用外部类的对象时使用,因为内部类使用this.调用的是内部类的域和方法,为了加以区别,所以使用类名.this来加以区分。...类名.class 指向每个类对应的唯一类对象(类型为Class) 类名.this 内部(可以是匿名内部类)类调用外部类的对象时使用,即在内部类中使用时:外部类对象是外部类名.this,内部类对象则是this

    7.6K40

    C++ 实现通过类名来进行实例化(反射机制?)

    参考:http://blog.csdn.net/cen616899547/article/details/9317323 目的:让一些类能通过他的类名来进行实例化,配合抽象工厂模式的使用 思路:1.有一个单例...factory类,其成员map m_classMap ;存放类名及相应的初始化函数。   ...2.每一个需要目的功能的类,都需要有一个静态CKDynamicClass*成员和静态createInstance函数,在CKDynamicClass*成员定义的时候,将该类的类名及相应的初始化函数作为参数传入...factory.h" /* * 在构造函数中注册类名及相应实例化函数 * 下面的两个宏,是方便定义CKDynamicClass*和createInstance */ class CKDynamicClass...:使用上面定义的两个宏 #ifndef TESTCLASS_H #define TESTCLASS_H #include "dynamicclass.h" /* * 在需要能通过类名进行初始化的类中

    2K31

    C++用于修饰的keyword

    p=&x:指针本身是个常量,固定指向某一变量,因此p不可变,可是*p可变 2.const修饰函数 (1)函数參数前加const是保护指针,引用传递的值不可改动 (2)类的成员函数后面加const,表面该函数不能改动成员变量...用Volatile修饰的变量每次都会从内存读取,防止脏读 4.Static (1)隐藏。...当我们同一时候编译多个文件时,全部未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件里定义同名函数和同名变量,而不必操心命名冲突。...(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚開始执行时就完毕初始化,也是唯一的一次初始化。共同拥有两种变量存储在静态存储区:全局变量和static变量。...在静态数据区,内存中全部的字节默认值都是0×00,某些时候这一特点能够降低程序猿的工作量。

    26710

    李宏毅的强化学习视频用于梳理翻阅

    本文主要是整理策略迭代的部分,重在阐明原理。李宏毅的视频,见网上。 最终说明OpenAI的默认强化学习算法PPO的部分。...,其每次交互的环境、每次的行为等,都是不确定的,最终有不同的轨迹 ? 。 但是,轨迹都是由该策略模型 ? 得到的,并得到不同的累积奖励R。...,获得的多条轨迹,用于策略模型?的学习,学习完以后的轨迹,因为?'没有改变,其生成的轨迹仍然可用。...最后一行,通过图中的蓝色框公式,反推得到的f(x),即离线策略下的优化目标函数J(其实和原始情况下的目标函数R的期望类似吧)。 ?...,用于生成轨迹。 ? 对比PPO2,其实质仍然是控制?,?′的相似性。但是没有使用KL散度,而是使用clip方法,限制两者的比值在一个范围内。

    55030

    C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符 那么具体是包括哪些符号不能作为文件名?...Slash (/) Plus sign (+) Pipe (|) Quotation mark (") 上面这些字符不能用来文件名和文件夹名 而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建....file这样的文件,但是用户是难以自己输入这样的文件名。...之外还有一些文件名是保留,不能创建这样的文件名 CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8...实际上微软已经做了这个了,因为在不同的系统,可能之后会添加新的字符串,所以最好不要自己写。

    42620

    C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符 ? 那么具体是包括哪些符号不能作为文件名?...Slash (/) Plus sign (+) Pipe (|) Quotation mark (") 上面这些字符不能用来文件名和文件夹名 而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建....file这样的文件,但是用户是难以自己输入这样的文件名。...之外还有一些文件名是保留,不能创建这样的文件名 CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    82120

    C++数组名a和&a的区别

    下面说说a和&a的区别,说完了,再看该题的结果。 C/C++里面的数组名字会退化为指针,所以数组名a实际指的是数组的第一个元素的地址。...而数组名作为指针来讲有特殊性,它正在它所指向的内存区域中,&a的值和a的数值是相同的(可以输出观察一下),但是类型和意义不同。而指针的加法操作和指向的数据类型密切相关。...但是&a的类型则相当于int **,是所谓指向数组的指针,是数组元素类型的二级指针,对它加1是相当于 &a + 1 * sizeof(a)的,所以会偏移一个数组长度。...现在来看程序,&a + 1其实偏移了一个数组的长度即就是6,其实在VS中通过调试可以查看&a + 1的类型,其类型为int[5] *,所以(int*)(&a + 1)将其强制转成int *类型。...这里应该很明显了a + 1指向的是数组a的第二个元素,p指向的是数组后面的元素(这里我们不知道它是多少),p - 1则指向数组的最后一个元素!  所以程序运行的结果为3 6.

    1K50

    c++容器类_类的容器

    在现在几乎所有的面向对象的语言中也都伴随着一个容器集,在C++ 中,就是标准模板库(STL )。 和其它语言不一样,C++ 中处理容器是采用基于模板的方式。...标准C++ 库中的容器提供了多种数据结构,这些数据结构可以与标准算法一起很好的工作,这为我们的软件开发提供了良好的支持!...这在下面具体的容器类中可以说明这一点。 容器适配器 是一个比较抽象的概念, C++的解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。...multimap , 和map 的原理基本相似,它允许“键”在容器中可以不唯一。...和mulmap 扩展了这一属性,可以允许元素不唯一; 3, 元素是有序的集合,默认在插入的时候按升序排列。

    82610

    C++工程中常用的宏定义(#define)

    参考链接: C++ vsnprintf() 尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。 ...但是,在一些实际工程中,我们还是不可避免的使用到了define,这给我们带来了极大的方便。 ...1 定义头文件,防止重复包含  其实不是真正的防止重复包含头文件,而是忽略除了第一次之外的其他包含:  http://blog.csdn.net/wangshubo1989/article/details...WANGSHUBO_SELF_MSG WM_USER + 29 static const std::string kDate = "2016-11-25";  3 分平台实现  对于一些快平台开发,完全可以使用define来包含不同的文件...,或是实现不同的功能:  #if (MY_PLATFORM == MY_PLATFORM_WIN32) #include #include "sakura/win32/compact/dirent.h

    1.9K20

    C++类的封装 | 类的封装

    C++公用接口与私有实现的分离 C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或 者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中,在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能...C++公用成员函数是用户使用类的公用接口或者说是类的对外接口,当然并不一定要把所有成员函数都指定为public的,但这时这些成员函数就不是公用接口了。...C++通过成员函数对数据成员进行操作称为类的实现, 为了防止用户任意修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,显然更不能修改它,用户只能接触到公用成员函数的目标代码。...C++类的成员函数在面向对象程序理论中被称为方法,方法是指对数据的操作,一个方法对应一种操作,只有被声明为公用的方法,才能被对象外界所激活,外界是通过发命令来调用有关方法的。 案例:C++使用类。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~ C++类的封装 | 类的封装 更多案例可以go公众号:C语言入门到精通

    1.7K64
    领券