编辑“︁
C++11
”︁(章节)
跳转到导航
跳转到搜索
脚本错误:没有“Mainspace editnotice”这个模块。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
=== 用於元編程的型別屬性 === 對於那些能自行創建或修改本身或其它程式的程式,我們稱之為[[元編程]]。這種行為可以發生在編譯或執行期。C++標準委員會已經決定引進一組由[[模板]]實現的函式庫,程式員可利用此一函式庫於編譯期進行元編程。 底下是一個以元編程來計算指數的例子: <syntaxhighlight lang="cpp"> template<int B, int N> struct Pow { // recursive call and recombination. enum{ value = B*Pow<B, N-1>::value }; }; template< int B > struct Pow<B, 0> { // ''N == 0'' condition of termination. enum{ value = 1 }; }; int quartic_of_three = Pow<3, 4>::value; </syntaxhighlight> 許多演算法能作用在不同的資料型別;C++模板支援[[泛型]],這使得代碼能更緊湊和有用。然而,演算法經常會需要目前作用的資料型別的資訊。這種資訊可以透過型別屬性(<code>type traits</code>)於模板實體化時將該資訊萃取出來。 型別屬性能識別一個物件的種類和有關一個型別(class或struct)的特徵。標頭檔<code><nowiki><type_traits></nowiki></code>描述了我們能識別那些特徵。 底下的例子說明了模板函式‘elaborate’是如何根據給定的資料型別,從而實體化某一特定的演算法(<code>algorithm.do_it</code>)。 <syntaxhighlight lang="cpp"> // 演算法一 template< bool B > struct Algorithm { template<class T1, class T2> static int do_it (T1 &, T2 &) { /*...*/ } }; // 演算法二 template<> struct Algorithm<true> { template<class T1, class T2> static int do_it (T1, T2) { /*...*/ } }; // 根據給定的型別,實體化之後的'elaborate'會選擇演算法一或二 template<class T1, class T2> int elaborate (T1 A, T2 B) { // 若T1為int且T2為float,選用演算法二 // 其它情況選用演算法一 return Algorithm<std::is_integral<T1>::value && std::is_floating_point<T2>::value>::do_it( A, B ) ; } </syntaxhighlight> 此種編程技巧能寫出優美、簡潔的代碼;然而除錯是此種編程技巧的弱處:編譯期的錯誤訊息讓人不知所云,執行期的除錯更是困難。
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息