0
点赞
收藏
分享

微信扫一扫

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​​​来指向与新值类型对应的​​模板实例​​.


举报

相关推荐

0 条评论