您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C++中為什么不要進行不受限制的非成員函數(shù)調(diào)用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
T.69:在模板內(nèi)部,不要進行不受限制的非成員函數(shù)調(diào)用,除非你希望它成為一個定制點
Provide only intended flexibility.
只按意圖提供彈性。
Avoid vulnerability to accidental environmental changes.
避免偶然的環(huán)境變化時的脆弱性。
Example(示例)
There are three major ways to let calling code customize a template.
存在三種主要的方式讓調(diào)用代碼定制模板。
template<class T>
// Call a member function
void test1(T t)
{
t.f(); // require T to provide f()
}
template<class T>
void test2(T t)
// Call a non-member function without qualification
{
f(t); // require f(/*T*/) be available in caller's scope or in T's namespace
}
template<class T>
void test3(T t)
// Invoke a "trait"
{
test_traits<T>::f(t); // require customizing test_traits<>
// to get non-default functions/types
}
A trait is usually a type alias to compute a type, a constexpr function to compute a value, or a traditional traits template to be specialized on the user's type.
特征通常是一種用于計算類型的類型別名,一種用于求值的常量表達式函數(shù),或者用于針對某個用戶類型特化的傳統(tǒng)的特征模板。
Note(注意)
If you intend to call your own helper function helper(t) with a value t that depends on a template type parameter, put it in a ::detail namespace and qualify the call as detail::helper(t);. An unqualified call becomes a customization point where any function helper in the namespace of t's type can be invoked; this can cause problems like unintentionally invoking unconstrained function templates.
如果你想用依賴模板類型參數(shù)的值t調(diào)用你自己的幫助函數(shù)helper(t),將它放入::detail命名空間并用detail::helper(t)對調(diào)用進行限定;如果一個幫助函數(shù)處于t的類型可以被觸發(fā)的命名空間,不受限的調(diào)用會成為一個定制點;這會引起意外調(diào)用非約束函數(shù)模板等問題。
Enforcement(實施建議)
在模板同一個命名空間中,如果存在一個同名非成員函數(shù),標記模板中針對傳遞受影響類型變量的非成員函數(shù)的不受限調(diào)
“C++中為什么不要進行不受限制的非成員函數(shù)調(diào)用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。