如何获取模块的所有成员/功能?

How to get all members / functions of a module?

module testmodule;

struct testmodule {}

pragma(msg, __traits(allMembers, testmodule));
pragma(msg, __traits(allMembers, .testmodule));

打印:

tuple()
tuple()

模块中的声明有模块名称怎么办?

对于您知道 testmodule 指的是模块 testmodule 的子结构的特定情况,您可以使用:

pragma(msg, __traits(allMembers, __traits(parent, testmodule));

如果您需要确定一个符号是否实际上是一个模块,这里是我快速拼凑的似乎有用的东西:

template isModule(alias sym) {
  enum isModule = !__traits(compiles, sym.sizeof);
}

static assert(!isModule!testmodule);
static assert(isModule!(__traits(parent, testmodule)));

我基本上猜测除了模块之外的任何东西都会有一个 sizeof 属性,但我可能忘记了一些其他类型的没有 [=14] 的非模块符号=].

没有提供这种消除歧义的内置机制,因为编译器通常可以自行计算,而根本没有预见到这种必要性。

这是一个简单的库实用程序,它概括了@rcorre 提出的方法(好主意!):

module getmod;

struct getmod {};

template isModule(alias sym)        
{
    static if (is(typeof(sym) == function))
        enum isModule = false;
    else
    {
        import std.array : startsWith;
        enum isModule = sym.stringof.startsWith("module ");
    }
}

template Module(alias sym)
    if (isModule!sym)
{
    alias Module = sym;
}

template Module(alias sym)
    if (!isModule!sym)
{
    import std.typetuple : TT = TypeTuple;
    alias Module = TT!(__traits(parent, sym))[0];
}

pragma(msg, __traits(allMembers, Module!getmod));
// tuple("object", "getmod", "isModule", "Module", "main")

这不如内置的符号反歧,但应该足够实用。