假设我有一个D模板结构:
struct Foo(alias pred) {}
我想写一个模板来反省pred是什么:
alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");
有没有简单的方法可以做到这一点?如果是这样,introspectPred
如何实施?
答案 0 :(得分:1)
我唯一能想到的是在Foo
类型中定义枚举并进行一些基本的内省。 E.g:
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()
{
}
答案 1 :(得分:0)
与Andrej的解决方案类似,但更灵活一点:
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);
我完全抛弃了内省模板 - 你应该能够通过在Predicate成员上使用typeof和lot来获得你需要的东西。
答案 2 :(得分:0)
template introspectPred(X:Foo!T,string T){alias T introspectPred;}
template introspectPred(X:Foo!T,alias T){alias T introspectPred;}
只有第二次过载就足够了,但DMD不同意。