ホームページ > バックエンド開発 > C++ > C の非構築関数での暗黙的な変換を防ぐにはどうすればよいですか?

C の非構築関数での暗黙的な変換を防ぐにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-03 08:18:18
オリジナル
338 人が閲覧しました

How Can I Prevent Implicit Conversions in Non-Constructing Functions in C  ?

非構築関数の暗黙的な変換回避

整数パラメータを期待するが、他の型からの暗黙的なキャストを許可する非構築関数を考えてみましょう。文字、ブール値、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート