Module 获取所有导入的具有traits的模块

Module 获取所有导入的具有traits的模块,module,d,typetraits,Module,D,Typetraits,有没有一种通过traits获得所有导入模块的方法,或者其他方法?据我所知,“所有成员”将不包括导入的成员 我想要实现的是从导入的模块中导入所有成员,但这似乎不像我想象的那么容易。如果我指定导入的完整模块,我可以很容易地获得我想要的成员,但如果我使用当前模块本身,则无法获得 所以我的问题是,在D中是否有一种方法可以获取导入的所有模块的名称,因为这样我可以创建一种在模块上使用“allMembers”的动态方法 来证明我的意思 假设我们有模块a module a; import b; import

有没有一种通过traits获得所有导入模块的方法,或者其他方法?据我所知,“所有成员”将不包括导入的成员

我想要实现的是从导入的模块中导入所有成员,但这似乎不像我想象的那么容易。如果我指定导入的完整模块,我可以很容易地获得我想要的成员,但如果我使用当前模块本身,则无法获得

所以我的问题是,在D中是否有一种方法可以获取导入的所有模块的名称,因为这样我可以创建一种在模块上使用“allMembers”的动态方法

来证明我的意思

假设我们有模块a

module a;

import b;
import c;

...

foreach (member; __traits(allMembers, a)) {
    // members of b and c will not come here ...
}
即使b和c的进口是公开的,他们也不会来


我想做的是无论如何都能在那里检索它们。

如果导入到结构中,那么
所有成员都应该可以工作;例如:

()

struct包{
导入标准元=标准元;
导入标准范围=标准范围;
导入标准范围接口=标准范围接口;
导入标准范围基本体=标准范围基本体;
导入标准性状=标准性状;
};
void main(){
foreach(X;uu特征(所有成员、包)){
pragma(msg,_-traits(allMembers,_-traits(getMember,Packages,X));
};
};
…还有一些我现在记不清的警告

如果您还希望“正常”导入模块,则可以从模块名称列表生成字符串混合。可能有很多方法可以做到这一点。(除非有人特别询问,否则我不会详细说明)


我在我的黑客中使用了这项技术,在
\uu traits(compiles
\uu traits(getProtection
)的帮助下取得了巨大的效果。因此,如果你打算做类似的事情,你可能想看看这一点


实际上,它并不像你想象的那么脆弱。我现在在每个项目中都使用std下划线。

导入的
b
c
不会包含在
allMembers
中,但是
b
c
本身会包含在内。如果你可以过滤m,你可以在每个模块上调用
allMembers
,以获取导入的模块带有一些
isModule(别名符号)
template(我不知道如何编写)的余烬。可能有助于您了解我的情况。它们根本不包括在内。我会看看我能想出什么,但到目前为止,这些解决方案对我来说没有任何影响。@rcorre,已经尝试过该解决方案,但没有什么不同。我要避免的是将模块名称全部手动键入,因为我必须在很多模块上执行此操作。谢谢尽管如此,这似乎只是一个软件包的问题。当我从一个模块中执行它时,它会起作用,但一旦我从一个软件包中执行它,它就会崩溃。有人能确认这是有意的行为还是?@Bauss我已经为相关功能准备了一个新的工具,但在我等待官方批准的过程中,它一直在衰退。但这需要你仍然保持im手动移植每个包。问题是我有多个嵌套包,因此一个包可能会导入其他包。在这种情况下,这是不够的,除非它处理好它。我所做的是放弃整个包系统,直接使用类似packages@Bauss不幸的是,似乎存在着一些问题ome编译器错误阻止了对导入的递归自省。例如,请参阅:-当
foo
是一个公开导入其他模块的模块时,这两对
杂注(msg
语句在打印不同的结果时,它们应该是相等的。所以现在这是我能做的最好的了。是的,我知道,我知道所有这些解决方法,但它们都不是很好。这就是为什么我提出这个问题,因为我想防止更多的黑客。D很好,但它是像这样的小错误不管怎么说,这都不值得,因为它有所有这些很酷的特性,它们不是很好用,只是有点用。我通常会为这类东西编写工具,然后在编译之前调用它们,但最终有这么多的解决方法,这一切都是一团糟:p你明白了吗?这比我第一次使用几年前使用D的艺术