テンプレート パラメーターの制限について: Float 値が禁止されている理由
C では、テンプレート パラメーターを使用してジェネリック クラスを定義する場合、特定の制限が適用されます。このような制限の 1 つは、float 値を非型テンプレート パラメーターとして使用できないことです。これは、次のようなコードをコンパイルしようとすると明らかになります:
template <class T, T defaultValue> class GenericClass { // ... }; int main() { GenericClass<float, 4.6f> gcFloat; // Error }
エラー メッセージ:
'float' is not a valid type for a template constant parameter Invalid type in declaration before ';' token
理由:
C 11 標準によれば、非型テンプレート引数は特定の要件に準拠する必要があります。整数型または列挙型の非型テンプレート パラメーターの場合、同じ型の変換された定数式のみが許可されます。浮動小数点値はメモリ内で正確に表現できないため、この要件を満たしていません。
技術的な説明:
浮動小数点値をテンプレート引数として使用すると、動作が矛盾する可能性があります。たとえば、次の点を考慮してください。
func<1/3.f>(); func<2/6.f>();
同じ関数を 2 回呼び出すつもりでも、2 つの計算の浮動小数点表現は同一ではない可能性があります。これにより、異なる結果が生じ、テンプレート引数を使用する目的が損なわれる可能性があります。
代替アプローチ:
浮動小数点値をテンプレート引数として表すには、C 11 の使用を検討してください。定数式 (constexpr)。コンパイル時に浮動小数点値の分子と分母を計算し、それらを個別の整数引数として渡す高度な式を作成できます。さらに、互いに近い浮動小数点値が同じ分子と分母を生成するようにしきい値を定義します。
以上がC で非型テンプレート パラメーターとして Float を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。