在标准库中有个模板函数:std::decay可以退化类型,但退化的并不完全,如const int**[]或者const int* const类型都无法做到完全退化。这里使用模板类型的递归实现: template<typename T> struct fulldecay { using type = T; }; template<typename T> struct fulldecay<const T> : fulldecay<T> { }; template<t…
在标准库中有个模板函数:std::decay可以退化类型,但退化的并不完全,如const int**[]或者const int* const类型都无法做到完全退化。这里使用模板类型的递归实现: template<typename T> struct fulldecay { using type = T; }; template<typename T> struct fulldecay<const T> : fulldecay<T> { }; template<t…
Concat使用变长的参数模板来接受不同的字符串(string, const char*),为了保证string不会多次分配空间,要先求出所有字符长度之和,分配空间后在依次添加。 变长求和函数: static int _Sum() { return 0; } template<typename T, typename... TArgs> static int _Sum(T t, TArgs... args) { return t + _Sum(args...); } 调用_Sum时,第一个参数会适配T,…
此文章主要涉及C++中template与typename关键字的使用,正常情况下template用来定义模板,typename后面定义类型名字,除此之外还有些其他用处。 typename关键字告诉编译把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字: 一个唯一的name(可以作为类型理解),嵌套在另一个类型中; 依赖于一个模板参数,就是说模板参数在某种程度上包含这个name,当模板参数是编译器在指认一个类型时便会产生误解, 如: Base<int>::name a…
在本篇文章中,Unicode指的是字符集而非UTF-16。 在Windows系统中,UTF8编码会被当作为普通的ASCII编码文件,ASCII是无法储存多字节字符的,所以使用UTF-8并且代码中存在多字节字符时会提示“该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”,遇到这种情况就是无法正确识别UTF-8文件,所以必须添加一个BOM头,即UTF-8 BOM编码格式,才可以正确识别为UTF-8编码。 在MSVC编译器中,可以使用UTF-8 BOM、其他Unico…
C与C#的交互 在C#执行C编写的DLL时可能会出现很多问题,而绝大部分问题都出自数据封装传送上,接下来总结了本次交互实验。 环境使用MSVC2019,使用__declspec(dllexport)作为DLL导出关键字,使用__stdcall作为调用协议。 为了更方便使用,声明两个宏:(WINAPI就是__stdcall,来自于windows.h) #define DLLEXPORT __declspec(dllexport) #define CALLAPI WINAPI C#中使用char*和sbyte*等指针使…
在程序中使用批量事件通知是很常用的场景,该事件分发器可以绑定多个静态与非静态函数,内部使用标准库的list和function实现,可变模板参数可以拓展到任意长度。 模仿C#中的委托,分为Events、Delegate、Action和Function。以下是继承的结构。 Events (添加移除静态与实例事件) Delegate (执行事件、按实例移除或全部移除) Action (Delegate特化版本) Function (继承Delegate,实现带返回值列表的执行事件) Function<bool>…
通过这种方式可以直接对接口实例化了(伪),动态的通过委托来实现接口,匿名类型是在运行时动态构建的。 实现思路: 使用AssemblyBuilder、TypeBuilder构建类型,并用FieldBuilder构建一个字典字段<String, Delegate>,用来保存函数名和匿名函数,MethodBuilder构建方法并使用IL流填充,调用保存的匿名函数表中的函数。 构建动态类型的方法要求传入一个<String, Delegate>函数字典,可以使用字典的初始化器来初始化匿名函数来达到实现…
在写关于二进制文件操作程序的时候,经常要去解析文件头,在C++中我通常是使用Stream把文件读取进来后直接将二进制数据拷贝到一个文件头结构体的内存中(memcpy,此处要注意内存对齐的问题),但在C#中没有这个函数,就自己实现了个。整体来说比较麻烦,我也没想到什么其他的好办法,如果有请给我留言。 public unsafe class Unmanaged { public static T CreateStructByBytes<T>(byte[] bytes) where T : unmanaged…
扩展方法可以使对象增加额外的“看似是成员”的方法。 普通的实例类型定义: public class InstanceClass { public int a = 3; public void instanceMethod() { this.a = 122; } } 扩展方法的定义: public static class InstanceClassExt { public static void Ext(this InstanceClass _this) { _this.a = 5; } } 分别对成员实例方法和扩…
无论是System.Draw.Color还是UnityEngine.Color对颜色操作的功能还是太少了,我们在用ps等调色面板使用的都是0-255范围的颜色值,但在图形层却使用的是0-1的浮点数,所以自己封了个支持多种Color操作的类型。 大写的RGB代表着0~255的整数。 小写rgb的范围是0~1的浮点数。 浮点转换整形使用四舍六入五求偶。 RGB转HSV公式: R' = R/255 G' = G/255 B' = B/255 Cmax = max(R', G', B') Cmin = min(R', G'…
COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.
Theme Kratos Made By Seaton Jiang