您好,登錄后才能下訂單哦!
本篇內容主要講解“C++中怎么使用模板提高代碼的抽象水平”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中怎么使用模板提高代碼的抽象水平”吧!
T.1:使用模板提高代碼的抽象水平
Generality. Reuse. Efficiency. Encourages consistent definition of user types.
普遍性。重用。效率。鼓勵用戶類型的一致性。
Example, bad(反面示例)
Conceptually, the following requirements are wrong because what we want of T is more than just the very low-level concepts of "can be incremented" or "can be added":
概念上,我們希望T不僅限于可以進行增量操作或者可以作為被加數這樣非常低水平的概念,因此下面的需求是錯誤的。
template<typename T>
// requires Incrementable<T>
T sum1(vector<T>& v, T s)
{
for (auto x : v) s += x;
return s;
}
template<typename T>
// requires Simple_number<T>
T sum2(vector<T>& v, T s)
{
for (auto x : v) s = s + x;
return s;
}
Assuming that Incrementable does not support+ and Simple_number does not support +=, we have overconstrained implementers of sum1 and sum2. And, in this case, missed an opportunity for a generalization.
假設Incrementable不支持+而且Simple_number不支持+=,我們過分約束了sum1和sum2的實現者。而且,在這種情況下,失去了泛化的機會。
Example(示例)
template<typename T>
// requires Arithmetic<T>
T sum(vector<T>& v, T s)
{
for (auto x : v) s += x;
return s;
}
Assuming that Arithmetic requires both + and +=, we have constrained the user of sum to provide a complete arithmetic type. That is not a minimal requirement, but it gives the implementer of algorithms much needed freedom and ensures that any Arithmetic type can be used for a wide variety of algorithms.
假設算術運算既需要+也需要+=,我們已經要求sum的用戶提供完全的算術類型。這不是最小化的需求,但是它為算法的實現者提供了所需的更多自由,而且保證算術類型可以用于多種多樣的算法。
For additional generality and reusability, we could also use a more general Container or Range concept instead of committing to only one container, vector.
為了額外的泛用性和重用性,我們也可以使用更通用的容器或范圍概念代替特定的容器vector。
Note(注意)
If we define a template to require exactly the operations required for a single implementation of a single algorithm (e.g., requiring just += rather than also = and +) and only those, we have overconstrained maintainers. We aim to minimize requirements on template arguments, but the absolutely minimal requirements of an implementation is rarely a meaningful concept.
如果我們定義了一個要求用于特定算法的特定實現的操作的模板(例如只要求+=而不同時要求=和+)而且只要求這些,我們就過分約束維護者了。我們的目的在于最小化模板參數的需求,但是某一實現的絕對最小需求幾乎不會成為有意義的概念。
Note(注意)
Templates can be used to express essentially everything (they are Turing complete), but the aim of generic programming (as expressed using templates) is to efficiently generalize operations/algorithms over a set of types with similar semantic properties.
模板可以用于從本質上表達任何東西(它們具備圖靈完備性),但是泛型編程的目的(像使用模板表達的那樣)是高效概括可以適用于具有相似語義屬性一套類型的操作/算法。
Note(注意)
The requires in the comments are uses of concepts. "Concepts" are defined in an ISO Technical Specification: concepts. Concepts are supported in GCC 6.1 and later. Consequently, we comment out uses of concepts in examples; that is, we use them as formalized comments only. If you use GCC 6.1 or later, you can uncomment them.
注釋中的需求是concept的用法。“Concepts”被定義在ISO技術規格中。GCC6.1之后的版本都支持Concepts。因此,在例子中我們注釋掉相關代碼;也就是說,我們只將它們用作標準注釋。如果你使用GCC6.1之后的版本,你可以去掉注釋符號。
Enforcement(實施建議)
Flag algorithms with "overly simple" requirements, such as direct use of specific operators without a concept.
標記需求過于簡單的算法,例如不用concept而直接使用特定操作符。
Do not flag the definition of the "overly simple" concepts themselves; they may simply be building blocks for more useful concepts.
不要標記定義過于簡單的concept本身;它們沒準只是作為某個更有用的concept的一部分存在的。
到此,相信大家對“C++中怎么使用模板提高代碼的抽象水平”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。