d替换工厂模式

因为正在弃用Object.factory(),这里,因此需要方便的替代方案.

TraitsExpression:
__traits ( getModuleClasses [, TraitsArgument] )

特征参数模块名全限定导入.
如果未指定TraitsArgument,则默认为当前模块.
它返回表示指定模块中定义的全限定类串元组.

如:

module test;
import std.stdio;
class C { }
pragma(msg, __traits(getModuleClasses));
pragma(msg, __traits(getModuleClasses, std.stdio);
//打印
tuple("test.C")
tuple("std.stdio.Stdio.Exception")

可附加".classinfo"这些串中,以取这些模块类信息.
这里

原文

我不得不说,我对该方法并不信服,原因有二:更通用的过滤方法要好得多.

__traits(getMembers, symbolOrModule, function/class/struct/union/field)
__特征(取成员,符号或模块,函数/类/构/联/字段)

将是非常有用的,且允许显著简化现有逻辑.
用例:注册Web路由,ORM,CLI处理.

但是该特征不按当前运行时moduleinfo那样工作,不是吗?

pragma(msg, __traits(getModuleClasses));  // A? 
static if (cond) class B {} 
pragma(msg, __traits(getModuleClasses)); // A, B? 
class A { } 
enum cond = true;

以上只是为了说明,可能有traits根据排序(结构成员列表中的特征)产生不同的结果更好的/实际的示例,但目前没有编译器来测试.

它产生:

tuple("B", "test2.A")
tuple("B", "test2.A")

如下会给你(更有用)实际类型.我用了5分钟就写好了

template AllClasses(alias mod) {
   import std.meta : AliasSeq;
   alias result = AliasSeq!();
   static foreach(m; __traits(allMembers, mod))
      static if(is(__traits(getMember, mod, m) == class))
         result = AliasSeq!(result, __traits(getMember, mod, m));
   alias AllClasses = result;
}
posted @   zjh6  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示