您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C++中怎么使用模板提高代碼的抽象水平”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++中怎么使用模板提高代碼的抽象水平”吧!
T.1:使用模板提高代碼的抽象水平
Generality. Reuse. Efficiency. Encourages consistent definition of user types.
普遍性。重用。效率。鼓勵(lì)用戶類型的一致性。
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不僅限于可以進(jìn)行增量操作或者可以作為被加數(shù)這樣非常低水平的概念,因此下面的需求是錯(cuò)誤的。
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.
假設(shè)Incrementable不支持+而且Simple_number不支持+=,我們過(guò)分約束了sum1和sum2的實(shí)現(xiàn)者。而且,在這種情況下,失去了泛化的機(jī)會(huì)。
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.
假設(shè)算術(shù)運(yùn)算既需要+也需要+=,我們已經(jīng)要求sum的用戶提供完全的算術(shù)類型。這不是最小化的需求,但是它為算法的實(shí)現(xiàn)者提供了所需的更多自由,而且保證算術(shù)類型可以用于多種多樣的算法。
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.
如果我們定義了一個(gè)要求用于特定算法的特定實(shí)現(xiàn)的操作的模板(例如只要求+=而不同時(shí)要求=和+)而且只要求這些,我們就過(guò)分約束維護(hù)者了。我們的目的在于最小化模板參數(shù)的需求,但是某一實(shí)現(xiàn)的絕對(duì)最小需求幾乎不會(huì)成為有意義的概念。
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.
模板可以用于從本質(zhì)上表達(dá)任何東西(它們具備圖靈完備性),但是泛型編程的目的(像使用模板表達(dá)的那樣)是高效概括可以適用于具有相似語(yǔ)義屬性一套類型的操作/算法。
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技術(shù)規(guī)格中。GCC6.1之后的版本都支持Concepts。因此,在例子中我們注釋掉相關(guān)代碼;也就是說(shuō),我們只將它們用作標(biāo)準(zhǔn)注釋。如果你使用GCC6.1之后的版本,你可以去掉注釋符號(hào)。
Enforcement(實(shí)施建議)
Flag algorithms with "overly simple" requirements, such as direct use of specific operators without a concept.
標(biāo)記需求過(guò)于簡(jiǎn)單的算法,例如不用concept而直接使用特定操作符。
Do not flag the definition of the "overly simple" concepts themselves; they may simply be building blocks for more useful concepts.
不要標(biāo)記定義過(guò)于簡(jiǎn)單的concept本身;它們沒(méi)準(zhǔn)只是作為某個(gè)更有用的concept的一部分存在的。
到此,相信大家對(duì)“C++中怎么使用模板提高代碼的抽象水平”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。