2011-12-25 15 views
13

Przez cały ten czas używałem alias, ale dzisiaj odkryłem przypadkiem, że D ma typedef. Co ciekawe, TDPL nawet go nie pokrywa (o ile nie jest to wymienione w D Keywords ani Errata). The site does cover it, ale nie mówi o tym zbyt wiele. Mój kod kompiluje się z jedną, ale jaka jest różnica między tymi dwoma i kiedy powinienem używać typedef przez alias?Jaka jest różnica między `alias` i` typedef`?

Odpowiedz

19

alias tworzy nową nazwę dla istniejącej. typedef działa tylko na typy, a właściwie tworzy nowy typ:

alias int A; 
typedef int B; 

pragma(msg, is(A == int)); // true 
pragma(msg, is(B == int)); // false 

Z typedef, można również zmienić domyślny inicjator:

typedef int A = 42; 

A a; 
A[5] b; 

void main() 
{ 
    assert(a == 42); 
    foreach(i; b) assert(i == 42); 
} 

alias jest bardziej ogólne. Współpracuje także z symbolami:

import std.stdio; 
import std.conv : to; 

alias to!(string) toString; 

void main() 
{ 
    int a; 
    alias a b; 
    a = 1; 
    writeln(b); // 1 

    string s = toString(2); 
    writeln(s); // 2 
} 

alias stosowany jest również, gdy chcemy połączyć zestawy przeciążeniem:

import std.stdio; 

class Base 
{ 
    void foo() { writeln("base"); } 
} 

class Derived : Base 
{ 
    alias super.foo foo; // merge overload sets 

    void foo(int i) { writeln("derived"); } 
} 

void main() 
{ 
    auto a = new Derived; 
    a.foo(); // base 
    a.foo(0); // derived 
} 

bez wyraźnej seryjnej, nazywając Base.foo użyciu instancją Derived nie jest dozwolone, ponieważ Derived.foo domyślnie ukrywa.

Jest to wymagane nie tylko w przypadku zajęć; jeśli funkcje z dwóch różnych importowanych modułów mają przeciążać się nawzajem, muszą zostać jednoznacznie scalone z alias.

typedef jest przestarzałe. Od wersji 2.057 DMD, użycie typedef wymaga skompilowania flagi -d (dla "przestarzałej").

This pull request dodaje szablon TypeDef do std.typecons replikacji funkcjonalność typedef w bibliotece standardowej.

7

Słowo kluczowe "typedef" jest pozostałością D1 i zawsze miało być przestarzałe. Począwszy od D 2.057, był w pełni przestarzały. Powinieneś zawsze używać aliasu podczas pracy z D2.

+0

Dlaczego był przestarzały? – Mehrdad

+0

alias jest uogólnioną funkcją aliasingu; możesz go użyć do aliasu pól, funkcji, zmiennych, typów i tak dalej. Zdecydowano, że jest to lepszy projekt niż typedef, który działa tylko dla typów. Co więcej, typedef jest w rzeczywistości naprawdę kiepskim wyborem słowa kluczowego w odniesieniu do tego, co robi. –

+0

@Zor: Weird ... wydawało się to dość intuicyjne ("zdefiniuj" nowy "typ" w oparciu o istniejący) i było to bardzo użyteczne przy definiowaniu UCHWYTÓW i wielu innych rzeczy ... – Mehrdad

Powiązane problemy