非構築関数の暗黙的な変換回避
整数パラメータを期待するが、他の型からの暗黙的なキャストを許可する非構築関数を考えてみましょう。文字、ブール値、long 型など。この意図しない動作を防止し、関数が指定された型のパラメーターのみを受け入れるようにするには、次の手法を使用できます。
C 11 以降のメソッド:
最も直接的なアプローチは、他のすべての型に一致する関数テンプレートを定義することです:
void function(int); // this will be selected for int only template <class T> void function(T) = delete; // C++11
これは、非テンプレート関数が直接一致するため機能します。
C 11 より前の手法:
C 11 より前の代替ソリューションには、目的の動作を強制するヘルパー クラスの作成が含まれていました:
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template <class T> void function(T a, DeleteOverload = 0); void function(int a) {}
この手法は、同様のシグネチャを持つ複数の関数のオーバーロードに依存しており、期待される型を持つ関数は次のようになります。 precedence.
C 23 更新:
C 23 では、この状況を処理するためのより簡潔で有益な方法が導入されています:
void function(int) {} // this will be selected for int only template <class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); }
Using static_assert inside関数テンプレートは、予期しないパラメーター型で関数を呼び出すときに明確なエラー メッセージを提供します。
以上がC の非構築関数での暗黙的な変換を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。