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 @ 2023-02-13 10:26  zjh6  阅读(19)  评论(0)    收藏  举报  来源