網(wǎng)站首頁 編程語言 正文
最近和一個朋友閑聊的時候他對我說一個人對C++的理解很多種境界,朋友不是個喜歡吹牛的人,于是聽他細(xì)說,覺得很是有道理。
想寫一篇C++ traits方面的文章已經(jīng)有一段時間了,但是說實話traits這項技術(shù)確實有些晦澀,很擔(dān)心寫完了達(dá)不到期望的效果,于是每每試圖以簡煉的文字表達(dá),慢慢的就等到了今天。
先說說我為什么專門對這項技術(shù)寫一篇文章吧。記得當(dāng)時在看STL/boost代碼的時候經(jīng)常遇到traits,當(dāng)時驚嘆于代碼原來可以這樣寫,但是最初根本是看不懂的,查了一些資料才徹底理解了traits存在的意義。
本質(zhì)定義:加上一層間接性,換來以定的靈活性。
看下面的代碼:
template <typename T> struct is_void { static const bool value = false; }; template <> struct is_void<void> { static const bool value = true; };
我們可以這樣使用這份代碼:
Is_void<false>::value 調(diào)用第一份代碼,也就是說只要我們傳入一個參數(shù)像下面這樣:
Is_void<T>::value,其中T可以為任意類型,我們就可以判斷這個類型是不是void在編譯期。
完整測試代碼如下:
template <typename T> struct is_void { static const bool value = false; }; template <> struct is_void<void> { static const bool value = true; }; int _tmain(int argc, _TCHAR* argv[]) { std::cout<<is_void<int>::value; std::cout<<is_void<void>::value; return 0; }
下面我們來看一個復(fù)雜點(diǎn)的例子,考驗一下你的理解:
namespace detail{ template <bool b> struct copier { template<typename I1, typename I2> static I2 do_copy(I1 first, I1 last, I2 out); }; template <bool b> template<typename I1, typename I2> I2 copier<b>::do_copy(I1 first, I1 last, I2 out) { while(first != last) { *out = *first; ++out; ++first; } return out; } template <> struct copier<true> { template<typename I1, typename I2> static I2* do_copy(I1* first, I1* last, I2* out) { memcpy(out, first, (last-first)*sizeof(I2)); return out+(last-first); } }; } template<typename I1, typename I2> inline I2 copy(I1 first, I1 last, I2 out) { typedef typename boost::remove_cv< typename std::iterator_traits<I1> ::value_type>::type v1_t; typedef typename boost::remove_cv< typename std::iterator_traits<I2> ::value_type>::type v2_t; enum{ can_opt = boost::is_same<v1_t, v2_t>::value && boost::is_pointer<I1>::value && boost::is_pointer<I2>::value && boost:: has_trivial_assign<v1_t>::value }; return detail::copier<can_opt>:: do_copy(first, last, out); }
總結(jié)
本文試圖以最簡潔的方式闡述對C++ traits 的理解,當(dāng)你理解了第二個例子的時候,相信你已經(jīng)理解了C++ traits,恭喜你對C++ 的理解上了一個層次。
Bibliography:
http://www.boost.org/doc/libs/1_31_0/libs/type_traits/c++_type_traits.htm
原文鏈接:https://www.cnblogs.com/pugang/archive/2012/10/17/2727378.html
相關(guān)推薦
- 2022-11-14 C++設(shè)計與聲明超詳細(xì)講解_C 語言
- 2023-05-08 C語言超詳細(xì)講解雙向帶頭循環(huán)鏈表_C 語言
- 2022-06-02 Kubernetes關(guān)鍵組件與結(jié)構(gòu)組成介紹_云和虛擬化
- 2022-05-10 react設(shè)置多個classname
- 2022-12-03 C#通過Builder模式造車_C#教程
- 2022-11-14 Go語言官方依賴注入工具Wire的使用教程_Golang
- 2022-11-29 React?中?memo?useMemo?useCallback?到底該怎么用_React
- 2022-12-29 c#?DataView.ToTable()方法?去除表的重復(fù)項問題_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支