私はC言語で記述しており、型変数の実装をしたいと考えています。たとえば、Haskellでは、次のような記述が可能です。C言語で型変数を実装する
data Matrix a = Matrix [a] Int Int
これは任意の型 'a'のエントリを持つ行列を定義できます。 Cでは、私は種類ごとにいくつかの構造を書いた:
struct zMatrix {
int dim_row;
int dim_col;
int *coords;
};
struct rMatrix {
int dim_row;
int dim_col;
float *coords;
};
...
は、一般的なマトリックス構造とCOORDSフィールドの種類を指定することになり、マトリックスを作成するためのいくつかの機能を持っているためにいくつかの方法はありますか?何かのように:
struct matrix {
int dim_row;
int dim_col;
(typevar type) *coords;
};
struct matrix matrixCreate(typevar type, int n, int m){...};
struct matrix M = matrixCreate(int, 3, 3);
struct matric M = matrixCreate(float, 3, 3);
...
'void *'や複数の型の 'union 'を持つことができます。それが良いアイデアかどうかは、別の質問です。 Cはハスケルではなく、あたかもあたかもそれがあたかもあたかもあたかも痛みを伴うかのように扱う。 – EOF
タイプが限られている場合は、マクロを使用して、すべてを繰り返さずに 'int、float、..'変種を生成することもできます。関数は '_Generic'を使ってタイプセーフな方法でジェネリックにすることができます。それでも、C言語のシンプルさに反して100%型の安全なインターフェースを実現するのではなく、パラメトリック・タイプを選択するのが一般的です。これはタイプセーフではなく、ユーザーに負担をかける(キャストが問題ないことを確かめなければならない)場合でも、 'void *'とキャストを使う基本的なオプションです。 – chi