4

void *を使用してCプログラミングでパラメトリックポリモーフィズムを実装できると言うのはなぜ正しくないのですか?

教授は質問を提起し、決して答えませんでした。ボイド*は実際にはパラメトリック多型と見なされる非常に低いレベルであると私は信じていますが、それにはもっと強い理由がありますか?

4

2 に答える 2

5

おそらくメカニズムが「あまりにも機械的」であるため、ポリモーフィズムが有用であると思われるという意味で有用でなくなるほどで​​す。

また、事後にポリモーフィック関数を拡張する簡単な方法がないためです。

C ++では、これを簡単に行うことができます。

Matrix4x4 a, b, c;

a = ...; /* Initialize matrices. */
b = ...;
c = a + b; /* Use overloaded (polymorphic) operator + to add. */

C ++では、上記はクラスでoperator+()定義されたものを使用しMatrix4x4ており、コンパイル時にそれを判別できます。+したがって、新しいデータ型を追加すると、既存の名前を再利用して、追加の方法を説明する関連コードが追加されます。Cではそれはできません。

Cでは、あなたが機能を持っていたとしても

void super_add(void *sum, const void *a, const void *b);

Matrixタイプを書いたばかりの場合、どのようにそれを伝えますか?一般的な型記述システムが必要になります。

void super_add(const char *sum_type, void *sum, const char *atype, void *a, const char *btype, const void *b);

新しい関数を追加できるように、何らかの形式の登録メカニズムを提供する必要があります。

void super_add_register(const char *sum_type, const char *atype, const char *btype, void (*adder)(void *sum, const void *a, const void *b));

次に、タイプ名を正しい加算関数と照合するコードを実装する必要があります。

要するに、それは一般的にそれの価値がありません。ただし、GObjectなど、これを多く実行するライブラリがあることに注意してください。

于 2012-12-17T10:50:15.927 に答える
1

パラメトリック多型のこの定義を取る:

必要に応じて、型変数を具象型に明示的または暗黙的に置き換えるメカニズム。

void *合っていない。

Cはマクロでそれを行うことができます:http: //rosettacode.org/wiki/Parametric_polymorphism#C

于 2012-12-17T11:01:55.453 に答える