【问题标题】:Introspecting Template Parameters (Especially Template Alias Parameters)内省模板参数(尤其是模板别名参数)
【发布时间】:2011-12-22 12:13:54
【问题描述】:
假设我有一个 D 模板结构:
struct Foo(alias pred) {}
我想写一个模板来反省一下 pred 是什么:
alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");
有什么简单的方法可以做到这一点吗?如果有,introspectPred如何实现?
【问题讨论】:
标签:
templates
metaprogramming
introspection
d
【解决方案1】:
我唯一能想到的就是在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()
{
}
【解决方案2】:
类似于 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);
我只是完全抛弃了自省模板——你应该能够通过使用 typeof 和谓词成员上的 lot 来获得你需要的东西。
【解决方案3】:
template introspectPred(X:Foo!T,string T){alias T introspectPred;}
template introspectPred(X:Foo!T,alias T){alias T introspectPred;}
只有第二个重载就足够了,但 DMD 不同意。