2016-04-09 13 views
0

私は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); 
... 
+6

'void *'や複数の型の 'union 'を持つことができます。それが良いアイデアかどうかは、別の質問です。 Cはハスケルではなく、あたかもあたかもそれがあたかもあたかもあたかも痛みを伴うかのように扱う。 – EOF

+1

タイプが限られている場合は、マクロを使用して、すべてを繰り返さずに 'int、float、..'変種を生成することもできます。関数は '_Generic'を使ってタイプセーフな方法でジェネリックにすることができます。それでも、C言語のシンプルさに反して100%型の安全なインターフェースを実現するのではなく、パラメトリック・タイプを選択するのが一般的です。これはタイプセーフではなく、ユーザーに負担をかける(キャストが問題ないことを確かめなければならない)場合でも、 'void *'とキャストを使う基本的なオプションです。 – chi

答えて

1

あなたはそれを行うことができます。前述の@EOFと同じように、異なるデータ型で異なる構造体の部分には共用体型を使用できます。おそらく構造体に型を表すものも格納したいと思うでしょう。あなたの例のように関数に型名を渡すことはできませんが、さまざまな型を表すenumを定義できます。その後、switch文を使用して任意のタイプ固有のコードを実装します。 switch文を使用する代わりに、型を記述するデータ構造体を使用することができます(これには、関数ポインタやその他の情報が含まれています)。各データ型のインスタンスを宣言し、型固有のコードは、適切な型のデータ構造の情報を使用して、必要な処理を行います。型データ構造体は、型enum値でインデックスを付ける配列であるか、型データ構造体へのポインタを使用して型を表すことができます。

C++がオプションであれば、これはずっと簡単になります。

関連する問題