言語valaについて読んでいて、Ansi Cコードにコンパイルしています。しかし、私はJavaやRustのようなジェネリックをサポートしていることも知っていました。今私の質問は、これがどのようにCコードにコンパイルされているのですか? gernericクラスまたは関数を持っている場合、一般的な動作をシミュレートするためにどのようなCコードが生成されますか?バラのジェネリックスをCコード
2
A
答えて
5
バラのジェネリックは、gpointer
とGType
に基づいています。
Genericクラスは、ポインター型のパラメーターでのみ特殊化できます。
class MyClass<T> {
public T val;
}
public static int main (string[] args) {
// This wouldn't compile!
// var il = new Gee.ArrayList<int>();
var il = new Gee.ArrayList<int?>();
var dl = new Gee.ArrayList<double?>();
il.add (5);
dl.add (3.0);
var im = new MyClass<int?>();
im.val = 5;
var dm = new MyClass<double?>();
dm.val = 3.0;
var lm = new MyClass< Gee.List<int?> >();
lm.val = il;
return 0;
}
あなたは-C
パラメータで生成されたコードを自分でチェックすることができます。
valac -C Main.vala --pkg gee-0.8
これはmain.c
ファイルを生成します。注意深く読んだ場合、メンバgpointer val
を持つMyClass(GObjectベースのクラスに必要ないくつかの追加のヘルパー構造に加えて)の構造体が1つしかないことがわかります。GType t_type
とt_dup_func
とt_destroy_func
もあります。
struct _MyClass {
// ...
gpointer val;
};
struct _MyClassPrivate {
GType t_type;
GBoxedCopyFunc t_dup_func;
GDestroyNotify t_destroy_func;
};
GLib type checkingに正しいタイプが確実に渡されます。これにより、Valaのジェネリック型は安全です(部分的にコンパイル時と実行時に部分的に)。
これは、コンパイル時に展開されるC++テンプレートとは対照的です。だから、古典的なC++のテンプレートよりもC#のジェネリックに近いです。
Valaコンパイラは、割り当てが常に正しいことがわかっているときに、Cコードの型チェックを省略するほどスマートなので、 "部分的にコンパイル時に"書きました。
はまた、Valaのは、Cのコードが簡単にGLibのバインディングを持っている
関連する問題
- 1. C#キャスティングとジェネリックス
- 2. C#7:タプルとジェネリックス
- 3. C#ジェネリックス - 使用方法
- 4. C#ジェネリックス:参照型と値
- 5. C#ジェネリックス - ジェネリックインターフェイス変換エラー
- 6. C#ジェネリックスとインターフェイスの実装を使用
- 7. C#のジェネリックスに問題がある
- 8. Javaジェネリックスのワイルドカードオペレータ
- 9. ジェネリックスのサブクラス化
- 10. ジェネリックスの構文
- 11. Kotlinのジェネリックスwith
- 12. ジェネリックスの関数
- 13. ArrayListのJavaジェネリックス
- 14. バラのGStreamerを使って.mp4を.oggに変換する
- 15. ジェネリックスのワイルドカードのインスタンス
- 16. C#のジェネリックスを使用した相互依存インターフェイス
- 17. ジェネリックスでC#メソッドのパラメータを確認する
- 18. Javaジェネリックスを学ぶ
- 19. Javaジェネリックスの問題
- 20. ジェネリックスとオブジェクトのパフォーマンス
- 21. Javaジェネリックスの質問
- 22. xmlとJavaの設定をバラと組み合わせる
- 23. Javaジェネリックスのパラメータを渡す
- 24. ジェネリックス質問
- 25. JavaジェネリックスNullPointerException
- 26. Javaジェネリックスとコレクション
- 27. ジェネリックスとベースクラス
- 28. Javaジェネリックス:ワイルドカード
- 29. JAXBマーシャリングとジェネリックス
- 30. ジェネリックスBSTヌルポインタ
セイ(C、PythonやC++、GJS、などのように)あなたは、汎用 'リストを書き'と他のプログラミング言語のための消耗品れることを意図されて生成されました'リスト'と 'リスト'を使用してください。 Valaコンパイラは、適切な振る舞いを持つC構造体 'list_int'と' list_double'を記述します。言い換えれば、特定のジェネリックをインスタンス化する作業はValaによって行われます。 –
nwp
これはC++テンプレートと同じではないでしょうか?しかし、テンプレートはジェネリックとまったく同じ振る舞いをしていません。 – Exagon
C++テンプレートは、C#のジェネリックスと同様に動作します([ここ](http://stackoverflow.com/a/31929/69809)で説明されています)。これはvalaジェネリックスが渡すジェネリックパラメータごとに実際の構造体を作成するのと同じ方法です。 – Groo