2012-12-07 15 views
12

Mam profesora, który napisał wszystkie swoje przykłady szablonów dw skrót:Czy ktoś może wyjaśnić skróconą formę szablonu języka D?

T exec(alias f,T)(T t) { 
    return f(t); 
} 

nie mogę znaleźć żadnych przykładów, które wyjaśniają, co to znaczy. Czy ktoś może to wyjaśnić?

+12

Dang, masz prof która pisze w D ?! coool! – Mehrdad

+1

Tak. Napisał długą gazetę, którą kazał nam przeczytać, zalecając nauczanie D jako kursu wprowadzającego (teraz uczą najpierw C#). – David

+0

Podoba mi się do tej pory, ale trochę trudno jest przyzwyczaić się do składni. – David

Odpowiedz

15

W szablonie funkcyjnym pierwszy zbiór tekstów zawiera argumenty szablonu, a drugi zestaw zawiera argumenty funkcji.

http://dlang.org/template.html#function-templates

Można przepisać że jako:

template exec(alias f, T) { 
    T exec(T t) { 
     return f(t); 
    } 
} 

W punkcie użytkowania, jeżeli członek szablon ma taką samą nazwę jak sam szablon, nie trzeba pisać je dwukrotnie. Nazywa się to tytułową sztuczką. http://www.bing.com/search?q=eponymous+trick+d+programming+language&qs=n&form=QBRE&pq=eponymous+trick+d+programming+languag&sc=0-0&sp=-1&sk=

Chociaż większość kodu D widziałem używa krótszego formatu - długa składnia szablonu jest dość rzadka dla funkcji, klas lub struktur, co może zrobić też: struct Foo (T) {} jest szablonem struktury z argumentem T.

Argumentami w tym szablonie exec są "alias f", który jest dowolnym symbolem, który zdecydujesz się przekazać, np. nazwa funkcji lub zmiennej, i "T", po prostu dowolny rodzajowy. Powtórzone T są odniesieniami do tego typu.

W miejscu użytkowania, będziesz najprawdopodobniej zobaczyć to tak:

int foo(int a) { return a; } // just a regular function 
exec!(foo)(10); // instantiates the template with arguments (foo, int), and then calls the function. 

Drugim argumentem jest tutaj szablon zorientowali się niejawnie przez argumenty funkcji. Jest to bardzo częste w przypadku szablonów funkcji: wiele argumentów szablonu jest niejawnych, więc rzadko je widać. Możesz zobaczyć to, o czym mowa w D dyskusji jako "IFTI", co oznacza "niejawne tworzenie szablonów funkcji".

+1

Dzięki! To pomaga! – David

+3

Aby uzyskać więcej informacji na temat szablonów D: http://ddili.org/ders/d.en/templates.html https://github.com/PhilippeSigaud/D-templates-tutorial/blob/master/dtemplates. pdf – jpf

3
T exec(alias f,T)(T t) { 
    return f(t); 
} 

Oto skrócona funkcja szablonu. Przycisk «normalny sposób», aby napisać to:

template exec(alias f, T) { 
    T exec(T t) { 
     return f(t); 
    } 
} 

W D, jeśli symbol w zakresie szablonu ma taką samą nazwę sam szablon ma, można go użyć jako szablonu (to jakoś aliasem).

Następnie parametr szablonu alias oznacza, że ​​może to być dowolne dowolne - dowolny symbol o symbolu. Tutaj może to być delegat, funkcja, fonctor, cokolwiek. Może to być nawet ciąg znaków, jeśli nauczyciel użył std.functional.unaryFun.

Parametr T, podobnie jak w C++, jest tylko symbolem typu.

Ta funkcja po prostu stosuje funktor. Oto najsilniejsza wersja:

https://github.com/D-Programming-Language/phobos/blob/master/std/functional.d#L39

+0

To "funktor", a nie "fonctor". "Funk" pochodzi z funkcji. –

Powiązane problemy