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

posted @   zjh6  阅读(20)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示