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

C で一致しない関数型の暗黙的な変換を防ぐにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-30 11:39:12662ブラウズ

How Can I Prevent Implicit Conversions for Non-Matching Function Types in C  ?

一致しない関数型の暗黙的な変換の防止

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。