d存储包括λ的任意类型
原文
我想存储任意类型,要用ubyte
数组.但要保存类型信息
.用:
SumType!(Tuple(int, string, double),Tuple(S, char))
想出了存储
创建时知道确切类型
的λ.
因为按序列模板参数
(又名可变
参数)提供数据
,可带带任意数据集.
set()
为@nogc
的.
import std; // Sorry :(
struct V_(size_t size)
{
// 数据位置
ubyte[size] mem;
// λ记忆使用方法.用`闭包`也可以
void function(void delegate(in char[]), const(ubyte)*) dataToStr;
// 设置数据进缓冲.
void set(Args...)(Args args) @nogc nothrow pure {
// 感谢Tuple! :)
alias Data = Tuple!Args;
// 放元组参数.
//
// BUG 1: 考虑对齐
// BUG 2: 大小是否足够
// BUG 3: 析构器
emplace(cast(Data*)(mem.ptr), Data(args));
// 存储(记忆动作)λ
dataToStr = (sink, ptr) {
// 转换回实际类型,
auto d = cast(Data*)(ptr);
static foreach (i; 0 .. args.length) {
if (i != 0) {
sink(", ");
}
sink((*d)[i].to!string);
}
};
}
void toString(scope void delegate(in char[]) sink) const {
dataToStr(sink, mem.ptr);
}
}
// 方便函数
auto V(size_t size = 1024)() {
return V_!size();
}
void main() {
// 空变量
auto v = V();
// 存储数据
v.set(42, "hello", 2.5);
writeln(v);
// 置不同类型
struct S {
int i;
}
v.set(S(7), 'a');
writeln(v);
}
这实际上几乎正是VariantN
所做的,只是它不存储λ
指针,而是存储模板函数实例
的指针.
fptr[1]
成员变量等同于dataToStr
.它存储"处理"模板实例
指针.每当为VariantN
分配新值时,都会更新fptr
来指向与新值类型对应的模板实例
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现