比方说,我有一个d模板结构:内省模板参数(尤其是模板别名参数)
struct Foo(alias pred) {}
我想写一个模板来反省什么预解码是:
alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");
有什么简单的方法来做到这一点?如果是这样,introspectPred
如何实施?
比方说,我有一个d模板结构:内省模板参数(尤其是模板别名参数)
struct Foo(alias pred) {}
我想写一个模板来反省什么预解码是:
alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");
有什么简单的方法来做到这一点?如果是这样,introspectPred
如何实施?
我能想到的唯一方法是在Foo
类型中定义枚举并做一些基本的反思。例如:
struct Foo(alias pred)
{
enum string _pred = pred;
}
alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");
template introspectPred(T)
{
enum string introspectPred = getMember!(T, "_pred");
}
template getMember(T, string member)
{
static if (__traits(hasMember, T, member))
{
enum getMember = mixin("T." ~ member);
}
else
enum getMember = "";
}
void main()
{
}
到安德烈的解决方案,但更多的灵活的类似:
struct Foo(alias pred)
{
enum Predicate = pred;
}
alias Foo!"a < b" FooLess;
static assert(FooLess.Predicate == "a < b");
// Other types of predicate work as well
bool bar() { return true; }
alias Foo!bar FooBar;
static assert(FooBar.Predicate == bar);
我只是扔了反思模板完全 - 你应该能够得到你需要通过使用typeof和批号在Predicate成员上。
template introspectPred(X:Foo!T,string T){alias T introspectPred;}
template introspectPred(X:Foo!T,alias T){alias T introspectPred;}
只有第二次超载应该是足够的,但DMD不同意。