一致しない関数型の暗黙的な変換の防止
C では、関数はさまざまな型のパラメーターを取ることができます。これには、暗黙的なキャストによって関数の引数として渡すことができるユーザー定義型が含まれます。ただし、特定のシナリオでは、この暗黙的なキャストを防止し、宣言された関数シグネチャに一致する引数のみに関数呼び出しを制限することが望ましい場合があります。
非構築関数の暗黙的な変換を回避するには、明示的なキーワードを使用できます。使用されます。ただし、このアプローチは関数を構築する場合にのみ機能し、関数を構築しない場合には機能しません。
この問題に対する 1 つの解決策は、他のすべての型に一致する関数テンプレートを定義することです。この手法では、一致しない型のテンプレート関数を優先し、正確な関数シグネチャを持つ元の関数に渡されるのを防ぎます。
例:
// Original function signature requires an int void function(int); // Function template matches all other types template <class T> void function(T) = delete; // C++11
このアプローチにより、正確なシグネチャ function(int) を持つ元の関数が、整数の引数が渡された場合にのみ呼び出されることになります。文字や Long など、その他のものは関数テンプレートをトリガーし、コンパイル エラーになります。
C 11 より前のメソッド:
C より前の C バージョンの場合11 では、別の手法を使用できます。
// Creating a class to handle overload deletion class DeleteOverload { private: DeleteOverload(void*); }; // Function template with overload deletion template <class T> void function(T a, DeleteOverload = 0); // Original function with exact signature void function(int a) {}
この手法では、DeleteOverload クラスを使用できません。インスタンス化され、テンプレート引数としての使用が事実上禁止されます。これにより、一致しないすべての型が強制的にテンプレート関数をトリガーし、正確な署名を持つ元の関数に到達することが禁止されます。
C 23 バージョン:
C 23 は導入されています。 static_assert 機能。このシナリオをより明確にするために利用できます。
void function(int); // Chosen for ints template <class T> void function(T) { static_assert(false, "function should only be called for ints"); } int main() { function(1); // function(1l); // Error: static assertion failed }
これを採用することでメソッドの場合、エラー メッセージは関数が整数専用であることを明確に伝え、コードの読みやすさと理解力を高めます。
以上がC で一致しない関数型の暗黙的な変換を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。