Анализ параметров шаблона (особенно параметров псевдонима шаблона) - PullRequest
3 голосов
/ 05 ноября 2011

Допустим, у меня есть структура шаблона D:

struct Foo(alias pred) {}

Я хочу написать шаблон для анализа того, что такое pred:

alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");

Есть ли простой способ сделать это?Если да, то как можно реализовать introspectPred? 1008 *

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Единственное, о чем я могу думать, - это определить перечисление внутри типа 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()
{

}
0 голосов
/ 09 декабря 2011
template introspectPred(X:Foo!T,string T){alias T introspectPred;}
template introspectPred(X:Foo!T,alias T){alias T introspectPred;}

Наличие только второй перегрузки должно быть достаточно, но DMD не согласен.

0 голосов
/ 14 ноября 2011

Похоже на решение Андрея, но немного более гибко:

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.

...