0
点赞
收藏
分享

微信扫一扫

d的crtp运行时决定函数模板

千白莫 2022-03-25 阅读 64


class Serializable(Derived, Base = Object) : Base {
static if (is(Base : Serializable!(Base, C), C)) {
override void serialize(...) {
serializeImpl();
}
} else {
void serialize(...) {
serializeImpl();
}
}
private void serializeImpl(...) {
auto target = cast(Derived) this;
... // 有继承类型了,可相应序化
}
}

class Person : Serializable!Person { ... }
class Boss : Serializable!(Boss, Person){...}
... // etc.

理念是在​​类层次​​结构中的​​每个叶类​​上方注入一个自动​​序列化​​代码样板的​​中间基类​​.由于​​CRTP​​,按模板参数传递​​你声明的类​​至​​Serializable​​包装器,这样它有在​​serializeImpl()​​中用来直接​​序化派生类​​数据的​​派生类类型​​的编译时信息.不需要运行时​​typeid()​​.最好用​​编译时自省​​.

当然,上面例子只是一半.对于​​反序化​​,需要动态选择​​正确反序化​​函数重载方法来重建​​派生​​类型.可通过用​​启动时运行​​的静态​​this()​​来注册​​反序化器​​到以​​派生类名称​​为键的全局​​AA​​中来完成:

static Object function(ubyte[] data)[string] deserializers;//静态全局.
//应该更明显点.
class Serializable(Derived, Base = Object) : Base {
...
static this() {//注册的是λ.
deserializers[Derived.stringof] = (ubyte[] data)
{//
auto obj = new Derived;
... // 解码代码
return obj;
};
}
...
}

然后主​​反序列器​​​只需在​​输入数据​​​中查找​​派生类名称​​​,并调用"​​反序化器​​​"中的​​适当函数​​​来重建派生对象,不依赖有问题的​​工厂函数​​.



举报

相关推荐

0 条评论