首頁 > 後端開發 > C++ > 如何防止 C 中非建構函數中的隱式轉換?

如何防止 C 中非建構函數中的隱式轉換?

Linda Hamilton
發布: 2024-12-03 08:18:18
原創
316 人瀏覽過

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

避免非建構子的隱式轉換

考慮一個需要整數參數但允許從其他型別隱式轉換的非建構子例如字元、布林值和長整型。為了防止這種意外行為並確保函數只接受指定類型的參數,我們可以採用以下技術:

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)
{}
登入後複製

此技術依賴於重載具有相似簽名的多個函數,其中具有預期類型的函數採用

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");
} 
登入後複製

在內部使用 static_assert當使用意外的參數類型呼叫函數時,函數模板會提供清晰的錯誤訊息。

以上是如何防止 C 中非建構函數中的隱式轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板