今回私はalias
を使用していましたが、今日はDがtypedef
であることを偶然発見しました。面白いことに、TDPLは私が知る限りではそれをカバーしていません(D Keywords
も正誤表にも記載されていません)。 site does cover itですが、それについてはあまり話しません。私のコードはいずれかでコンパイルされますが、その2つの違いは何ですか?また、よりもtypedef
を使用する必要がありますか?`alias`と` typedef`の違いは何ですか?
13
A
答えて
19
alias
は、既存のものの新しい名前を作成します。 typedef
のみのタイプで動作し、実際に新しいタイプの作成:typedef
で
alias int A;
typedef int B;
pragma(msg, is(A == int)); // true
pragma(msg, is(B == int)); // false
を、あなたはまた、デフォルトの初期化子を変更することができます。
typedef int A = 42;
A a;
A[5] b;
void main()
{
assert(a == 42);
foreach(i; b) assert(i == 42);
}
alias
は、より一般的です。また、記号で動作します:あなたは、過負荷セットをマージするとき
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
も使用されています
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
}
明示的にマージすることなく、許可されていないDerived
のインスタンスを使用してBase.foo
を呼び出し、なぜならDerived.foo
デフォルトでそれを隠します。
これはクラスに必須ではありません。 2つの異なるインポートされたモジュールの関数が互いにオーバーロードされる場合は、明示的にalias
とマージする必要があります。
typedef
は推奨されていません。 DMDバージョン2.057では、typedef
を使用するには、-d
( "廃止予定")フラグをコンパイルする必要があります。
This pull requestは、標準ライブラリのtypedef
の機能を複製std.typecons
にテンプレートTypeDef
を追加します。
7
'typedef'キーワードは、D1の残りの部分であり、常に非推奨となっています。 D 2.057以降、完全に廃止されました。 D2を使用する場合は、常にエイリアスを使用する必要があります。
関連する問題
- 1. typedefとの違いは何ですか?
- 2. typedefとenumの違いは何ですか
- 3. ''は<alias>とは何ですか?
- 4. CakePHPのmodel-> aliasとmodel-> nameの違いは何ですか?
- 5. とCakeスクリプトAlias/Addinの最小限の例は何ですか?
- 6. Android <activity-alias>のユーザーIDとは何ですか?
- 7. typedef BOOL(WINAPI * FN_SetupDiGetDeviceProperty)は何ですか?
- 8. C++でtypedefとポインタのルールは何ですか?
- 9. $と$$の違いは何ですか?
- 10. `##`と `hashCode`の違いは何ですか?
- 11. NodeJS:「./ ..」と「..」の違いは何ですか?
- 12. {}())と{})の違いは何ですか?
- 13. `&`と `ref`の違いは何ですか?
- 14. `==`と `is`の違いは何ですか?
- 15. difftimeと ' - 'の違いは何ですか?
- 16. #{} $ {}と%{}の違いは何ですか?
- 17. ⊕と+の違いは何ですか?
- 18. アペンダーと〜の違いは何ですか?
- 19. "./"と "../"の違いは何ですか?
- 20. "$^N"と "$ +"の違いは何ですか?
- 21. %Qと%{}の違いは何ですか?
- 22. バックスティックと$()の違いは何ですか?
- 23. A`と ``の違いは何ですか[:] `
- 24. git config aliasの感嘆符の意味は何ですか?
- 25. パッケージのインポートobjと何かの違いをインポートパッケージとPythonの何かの違いは何ですか?
- 26. C++のtypedef列挙するだけの違いである正確に何
- 27. METADATAとMETADATA.jl:違いは何ですか?
- 28. twistdとnohup&:違いは何ですか?
- 29. libspeとlibspe2?違いは何ですか?
- 30. Backbone.jsとPusherapp - 違いは何ですか?
なぜ廃止されましたか? – Mehrdad
エイリアスは一般化エイリアシング機能です。フィールド、関数、変数、型などのエイリアスに使用できます。これは、型に対してのみ機能するtypedefを持つよりも優れた設計であると判断されました。さらに、typedefは実際にはそれが何のためのキーワードの本当に貧しい選択です。 –
@Zor:奇妙な...それはかなり直感的で(既存のものに基づいて新しいタイプを定義しているように)、実際にハンドルや他の多くのものを定義するのに非常に便利でした... – Mehrdad