質問
以下の関数をuint8_t、uint16_t、uint32_t、int8_t、int16_t、int32_t、float_tに対して汎用にするにはどうすればよいですか?
ご覧のとおり、すべての場合に同じロジックを繰り返すのは好きではありません。それぞれの場合の唯一の違いは鋳造です。
理想的には、C標準に準拠しているため、移植性のあるソリューションが必要です。どんなアイデアでも大歓迎です。
ありがとうございます。 ジェネラコディセタグプレ
解決
ええと、キャストを抽出することができます : ジェネラコディセタグプレ
または、さまざまな型が0から連続した値の範囲を形成する場合は、関数ポインターの2つの配列を作成して、次のことを行うこともできます。 ジェネラコディセタグプレ
注:
- 必要に応じて簡単にマクロ生成できますが、タイプごとに2つの関数を作成する必要があります。
- この小さなコードでは、それだけの価値はないようです。
- 使用するすべての整数型のすべての値を表すことができるため、
int64_t
を選択しました。したがって、int64_t
に変換しても、情報が破棄されたり、で同じ比較を行うことに関して比較の結果が変更されたりすることはありません。ソースタイプ。ただし、uint64_t
もカバーしたい場合は、すべての整数型のすべての値を表すことができる整数型がないため、すべてに同じ型を使用することはできません。また、testLimitsf
用に別のfloat
関数が必要です。おそらく、将来の柔軟性のために、long double
を一般的なタイプとして使用します。 - [編集:IEEE-754を想定すると、
double
は、実際には、使用するすべてのタイプのすべての値を正確に表すことができることに気づきました。したがって、移植性にわずかな制限がありますが、すべてにtestLimitsf
を使用して、ダブルスで対処することができます] - 比較する前に、(たとえば)
uint8_t
に変換する価値があると確信していますか?値がuint8_t
の範囲内にあるか、変換する必要がない場合は、比較を行うだけです。または、値が範囲内にない場合、モジュロ削減により、0と-1の特別な場合を除いて、比較が少し無意味になります。ですから、あなたが述べていないことがそうなるなら、それは価値があるかもしれませんが、それは私には怪しいように見えます。 - あなたはコメントで「私はその機能をより効率的にしようとしています」と言った。これはそれに反するかもしれません。
testLimits
と、switch
のキャスト関数の呼び出しをインライン化することは論理的に可能ですが、私はそれを当てにしません。
他のヒント
Cでこのようなジェネリックプログラミングを行う簡単な方法はありません。メンテナンスが心配な場合は、マクロが適切な場合はまれです。
マクロを使用しないのはなぜですか? ジェネラコディセタグプレ
標準の次のリビジョン(C1x)では、型ジェネリック式のサポートが追加されます(ウィキペディアの例): ジェネラコディセタグプレ
gccには、予備的なC1xサポートがあります。_Genericはまだサポートされていないと思いますが、将来のために覚えておいてください。
所属していません StackOverflow