網站首頁 編程語言 正文
最近和一個朋友閑聊的時候他對我說一個人對C++的理解很多種境界,朋友不是個喜歡吹牛的人,于是聽他細說,覺得很是有道理。
想寫一篇C++ traits方面的文章已經有一段時間了,但是說實話traits這項技術確實有些晦澀,很擔心寫完了達不到期望的效果,于是每每試圖以簡煉的文字表達,慢慢的就等到了今天。
先說說我為什么專門對這項技術寫一篇文章吧。記得當時在看STL/boost代碼的時候經常遇到traits,當時驚嘆于代碼原來可以這樣寫,但是最初根本是看不懂的,查了一些資料才徹底理解了traits存在的意義。
本質定義:加上一層間接性,換來以定的靈活性。
看下面的代碼:
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 調用第一份代碼,也就是說只要我們傳入一個參數像下面這樣:
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; }
下面我們來看一個復雜點的例子,考驗一下你的理解:
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); }
總結
本文試圖以最簡潔的方式闡述對C++ traits 的理解,當你理解了第二個例子的時候,相信你已經理解了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
相關推薦
- 2022-09-24 opencv實現圖像傾斜校正_C 語言
- 2022-08-05 EasyExcel 3.X 簡單讀取Excel文件數據
- 2022-09-07 教你應用?SOLID?原則整理?React?代碼之單一原則_React
- 2022-07-03 el-upload上傳組件的動態添加;el-upload動態上傳文件;el-upload區分文件是哪
- 2023-08-16 uniapp中v-model數據無法讀取問題 failed for prop “value“
- 2022-08-04 如何利用python實現列表嵌套字典取值_python
- 2022-09-28 Python變量定義的簡單使用介紹_python
- 2022-12-05 Django中QuerySet查詢優化之prefetch_related詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支