8

こんにちは、

クラスの割り当てのためにいくつかのプログラムを実装していたときに、C を使用して一般的な方法で同じものを実装するのはどうだろうかと思いました。

void ポインターと関数を使用する必要があることは知っていますが、その方法については行き詰まっていました。簡単で使用法を示す例を教えてください。

比較関数を実装して比較 sort を実装する方法、または各ノードがさまざまなタイプの要素を持つリンクリストに挿入する方法など...

PS : 他の質問や記事へのリンクは役に立ち、歓迎します。

4

3 に答える 3

3

明らかに、型をパラメータ化する 1 つの方法は、プリプロセッサを使用することです。

#define DIVIDE_FUNC(type) divide_##type
#define DIVIDE_CALL(type, a, b) DIVIDE_FUNC(type)((a), (b))
#define DIVIDE_DECL(type) type DIVIDE_FUNC(type)(type a, type b)
#define DIVIDE_IMPLEMENTATION DIVIDE_DECL(DIVIDE_TYPE) { return a / b; }

#define DIVIDE_TYPE int
DIVIDE_IMPLEMENTATION
#undef DIVIDE_TYPE
#define DIVIDE_TYPE double
DIVIDE_IMPLEMENTATION

#include <stdio.h>

int main (void) {
    int i = 5, j = 2;
    (void) printf("int %d / %d = %d\n", i, j, DIVIDE_CALL(int, i, j));
    (void) printf("double %d / %d = %f\n", i, j, DIVIDE_CALL(double, i, j));
    return 0;
}

これは と の 2 つの関数を実装divide_doubledivide_intます。DIVIDE_TYPEより複雑な (現実的な) 例では、実装は、異なる定義を持つ型ごとに個別にコンパイル (またはインクルード) される個別のコンパイル ファイルにある可能性があります。

実際のジェネリックと比較した欠点は、さまざまな型の実装が自動的に生成さDIVIDE_CALL(mytype, x, y)れないことです。つまり、実装mytypeが生成されません。(もちろん、これはいくつかの比較的単純なスクリプトで調整できますが、実際にはもう C を使用していないと主張する人もいるかもしれません。よりきれいなジェネリックが組み込まれた言語が存在します。=)

いずれにせよ、これはデータ構造など、実際のデータ型 (void *ポインタではない) が必要な場合に機能します。

于 2010-11-20T12:42:24.347 に答える
2

void* ポインターを使用してから、多くのキャストを使用できます。元の要素に再キャストするには、何らかの形で型を保存する必要があることに注意してください。そのため、正確には一般的ではありませんが、取得できる限り近いものです。

明らかに、この種のコードは非常にエラーが発生しやすいです。

于 2010-11-20T12:30:42.203 に答える
0

このようなもの: https://github.com/10098/breakout/tree/master/dl_list/

練習用に書いた二重連結リストの実装です。シンプルなブレイクアウトのようなゲームで使用します。

于 2010-11-20T13:23:37.743 に答える