module testmodule;

struct testmodule {}

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


印刷品:

tuple()
tuple()


当模块中的声明具有模块名称时,该怎么办?

最佳答案

没有提供用于这种错误解释的内置机制,因为通常编译器可以自行解决它,而根本没有预见到这种必要性。

这是一个简单的库实用程序,可以概括@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")


这不如内置符号删除功能好,但应该足够实用。

关于reflection - 如何获得模块的所有成员/功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29315430/

10-13 01:29