溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中為什么不要過度參數(shù)化

發(fā)布時間:2021-11-24 10:58:08 來源:億速云 閱讀:101 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“C++中為什么不要過度參數(shù)化”,在日常操作中,相信很多人在C++中為什么不要過度參數(shù)化問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++中為什么不要過度參數(shù)化”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

T.61:不要過度參數(shù)化成員(SCARY)

Reason(原因)

A member that does not depend on a template parameter cannot be used except for a specific template argument. This limits use and typically increases code size.

不依賴于模板參數(shù)的成員無法使用,特定的模板參數(shù)除外。這會限制使用并通常會增加代碼大小。

Example, bad(反面示例)

template<typename T, typename A = std::allocator{}>
   // requires Regular<T> && Allocator<A>
class List {
public:
   struct Link {   // does not depend on A
       T elem;
       T* pre;
       T* suc;
   };

   using iterator = Link*;

   iterator first() const { return head; }

   // ...
private:
   Link* head;
};

List<int> lst1;
List<int, My_allocator> lst2;

This looks innocent enough, but now Link formally depends on the allocator (even though it doesn't use the allocator). This forces redundant instantiations that can be surprisingly costly in some real-world scenarios. Typically, the solution is to make what would have been a nested class non-local, with its own minimal set of template parameters.

代碼看起來足夠正確,但是現(xiàn)在Link形式上依賴于分配器(即使它沒有使用分配器)。這會引發(fā)多余的例示,而這種例示在某些現(xiàn)實流程中可能會帶來令人驚訝的高成本。通常的解決方案是讓本來的嵌套類別弄成非局部的,同時它的成員只擁有最少的模板參數(shù)。

template<typename T>
struct Link {
   T elem;
   T* pre;
   T* suc;
};

template<typename T, typename A = std::allocator{}>
   // requires Regular<T> && Allocator<A>
class List2 {
public:
   using iterator = Link<T>*;

   iterator first() const { return head; }

   // ...
private:
   Link* head;
};

List<int> lst1;
List<int, My_allocator> lst2;

Some people found the idea that the Link no longer was hidden inside the list scary, so we named the technique SCARY. From that academic paper: "The acronym SCARY describes assignments and initializations that are Seemingly erroneous (appearing Constrained by conflicting generic parameters), but Actually work with the Right implementation (unconstrained bY the conflict due to minimized dependencies)."

有些人會發(fā)現(xiàn)Link不再被list隱藏,因此我們稱這種技術(shù)為SCARY。根據(jù)大學論文:“SCARY這個縮寫描述了一些看起來錯誤(看起來被沖突的參數(shù)約束),但實際上可以和正確的實現(xiàn)一起工作(由于最小化的依賴關(guān)系而不會被沖突所限制)的賦值和初始化?!?br/>

Enforcement(實施建議)

  • Flag member types that do not depend on every template argument

  • 標記不依賴于任何模板參數(shù)的成員

  • Flag member functions that do not depend on every template argument

  • 標記不依賴于任何模板參數(shù)的成員的成員函數(shù)。

到此,關(guān)于“C++中為什么不要過度參數(shù)化”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(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)容。

c++
AI