如何获取模块的所有成员/功能?
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")
这不如内置的符号反歧,但应该足够实用。
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")
这不如内置的符号反歧,但应该足够实用。