[C++] traits機制

文章目錄

  • C++之type_traits
    • is_floating_point<T> ..的使用
    • std::enable_if<T>::type的使用
    • std::remove_cv
  • 如何自定義traits

C++之type_traits

is_floating_point …的使用

  • 一般在定義打印模板函數的時候,當我們用printf進行終端日志打印,需要根據打印的類型來設置flag,所以這個時候判斷數據類型就很必要了, 我們可以根據is_same,is_float_point, is_integral等來確定類型情況。可以參考cuda打印實例
 std::is_floating_point<yourtype>::value;std::is_same<type1, type2>::value;
  • 這些is_xxx的函數,如何定義的; 有什么可以學習的點

std::enable_if::type的使用

  • c++的原則就替換失敗并非錯誤(SFINAE)。std::enable_if 就是滿足條件時類型是有效的
  • 所謂的SFINAE規則就是在編譯時進行查找替換,對于重載的函數,如果能夠找到合適的就會替換,如果第一個不合適并不會報錯,而會使用下一個替換直到最后一個,如果都不滿足要求,那么才會報錯。出現二義性的話也會報錯。
  • 主要兩個應用
  • 類型判斷,可以自定義類型判斷
//判斷類型
template <typename _Tp>
struct Smart_pointer : public false_type {};template <typename _Tp>
struct Smart_pointer<std::weak_ptr<_Tp>> : public true_type {};template <typename _Tp>
struct Smart_pointer<std::shared_ptr<_Tp>> : public true_type {};template <typename _Tp>
struct is_smart_pointer : public Smart_pointer<typename std::remove_cv<_Tp>::type>{};template <typename _Tp>
typename enable_if<is_smart_pointer<_Tp>::value,void>::type check(_Tp p){std::cout << "is smart pointer" << std::endl;
}
template <typename _Tp>
typename enable_if<!is_smart_pointer<_Tp>::value,void>::type check(_Tp p){std::cout << "not smart pointer" << std::endl;
}
void test_enable_if(){int *p = new int(3);std::shared_ptr<int> sp = std::make_shared<int>(3);check(sp);check(p);delete p;
}
  • 返回值指定,根據輸入類型判斷返回值
template <typename _Tp>typename enable_if<std::is_integral<_Tp>::value,bool>::type is_odd(_Tp i){return i&0x1;}void test_is_odd(){std::cout << std::boolalpha << is_odd(10) << std::endl;}
  • Apollo開源代碼中的一個實例; 利用C++的SFINAE原則,實現在類的繼承過程中,上層類中定義一個必執行的函數,里面調用子類可能實現可能不實現的具體函數,這個時候就用到了這個特性,通過模板推導機制,實現子類定義這個具體操作時,這個必執行的函數會調用這個具體操作,當沒有定義是,就按照這個必執行函數的默認操作去執行。

  • Apollo 開源代碼示例分析-HasShutdown

#include <type_traits>
#include <utility>// apollo: cyber/base/macros.h
#define DEFINE_TYPE_TRAIT(name, func)                     \template <typename T>                                   \struct name {                                           \template <typename Class>                             \static constexpr bool Test(decltype(&Class::func)*) { \return true;                                        \}                                                     \template <typename>                                   \static constexpr bool Test(...) {                     \return false;                                       \}                                                     \\static constexpr bool value = Test<T>(nullptr);       \};                                                      \\template <typename T>                                   \constexpr bool name<T>::value;// apollo: cyber/common/macros.h
/**
template <typename T>
struct HasShutdown {template <typename Class>static constexpr bool Test(decltype(&Class::Shutdown)*) {return true;}template <typename>static constexpr bool T(...) {return false;}static constexpr bool value = Test<T>(nullptr);
};
template <typename T>
constexpr bool HasShutdown<T>::value;*/
DEFINE_TYPE_TRAIT(HasShutdown, Shutdown)template <typename T>
typename std::enable_if<HasShutdown<T>::value>::type CallShutdown(T *instance) {instance->Shutdown();
}template <typename T>
typename std::enable_if<!HasShutdown<T>::value>::type CallShutdown(T *instance) {(void)instance; // 可以自定義任何默認的動作。
}/** 分析
1. 當instance實例的類中有Shudown時,第一個模板中HasShutdown<T>::value是true,則enable_if<true>::type是合法的;則第一個模板函數被匹配;而此時!HasShutdown<T>::value是false,則第二個模板函數匹配有問題,所以根據C++的SFINAE原則,則第一個被推導出來;所以當調用CallShutdown時,第一個函數被調用,而其有會調用instance中的shutdown函數。
3. 反之,當instance中沒有shutDown,則第一個的HasShutdown<T>::value是false,則std::enable_if<HasShutdown<T>::value>::type非法,所以第一個模板不能被推導出來,而第二個模板被推導出來,所以當調用CallShutdown時,第二個函數形式被調用;從而這就實現了,當有Shutdown的時候調用自己定義的,否則不做任何事情。
*/// 下面是CallShutdown被使用時的場景, 通過在一個單例中cleanup里調用,來實現用戶定制或不定制的情況。
#define DECLARE_SINGLETON(classname)                                      \public:                                                                  \static classname *Instance(bool create_if_needed = true) {              \static classname *instance = nullptr;                                 \if (!instance && create_if_needed) {                                  \static std::once_flag flag;                                         \std::call_once(flag,                                                \[&] { instance = new (std::nothrow) classname(); }); \}                                                                     \return instance;                                                      \}                                                                       \\static void CleanUp() {                                                 \auto instance = Instance(false);                                      \if (instance != nullptr) {                                            \CallShutdown(instance);                                             \}                                                                     \}                                                                       \\private:                                                                 \classname();                                                            \DISALLOW_COPY_AND_ASSIGN(classname)

std::remove_cv

  • 去掉變量的const, volatile屬性,獲取其原始類型信息。

實現方式

  • 模版推導丟棄const和volatile參數。

性能開銷

  • 模版推導完成操作,不涉及運行時開銷。

調用stl

  • remove_const
  • remove_volatile

作者:i_need_job
鏈接:https://www.jianshu.com/p/a771299d3a89
來源:簡書

如何自定義traits

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85853.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV 視頻處理與保存

一、知識點 1、VideoCapture類 (1)、用于從視頻文件、攝像機或圖像序列中捕獲視頻幀。 (2)、構造函數 VideoCapture(const String & filename, int apiPreference CAP_ANY) a、filename可以是視頻文件的名稱(例如"video.avi")&#xff0c;可以是圖…

【Leetcode】字符串之二進制求和、字符串相乘

文章目錄 算法原理二進制求和題目鏈接題目描述解題思路代碼 字符串相乘題目鏈接題目描述解題思路代碼 算法原理 這兩道題都是屬于算法里一種經典題型&#xff1a;高精度加/減/乘/除法&#xff0c;需要我們模擬加/減/乘/除 列豎式運算。 二進制求和 題目鏈接 題目鏈接 題目描…

MongoDB:索引

目錄 1、索引數據結構&#xff1a;B-樹 2、索引類型 2.1 單字段索引 2.2 復合索引&#xff08;最重要&#xff01;&#xff09; 2.3 多鍵索引&#xff08;數組字段&#xff09; 2.4 地理空間索引 2.5 全文索引 2.6 哈希索引&#xff08;分片專用&#xff09; 2.7 TTL …

【大模型】Transformer架構完全解讀:從“盲人摸象“到“通曉萬物“的AI進化論

&#x1f916; Transformer架構完全解讀&#xff1a;從"盲人摸象"到"通曉萬物"的AI進化論 —— 一位大模型探索者的技術日記 ? 第一章&#xff1a;為什么說Transformer是AI界的"蒸汽機革命"&#xff1f; 1.1 從RNN到Transformer&#xff1a;…

JavaEE:使用JMeter進行接口并發測試

一、下載與安裝&#xff1a; 1.下載apache-jmeter-5.6.3.zip&#xff1a; https://jmeter.apache.org/download_jmeter.cgi 2.解壓到D:\Program Files\apache-jmeter-5.6.3目錄 3.添加JDK環境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件開頭&#xff1…

【筆記】MSYS2 的 MinGW64 環境中正確安裝 Python 相關環境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 環境配置與 Python 項目依賴管理筆記_msys更新python-CSDN博客 【技術筆記】MSYS2 指定 Python 版本安裝方案_pacman -u 安裝指定版本-CSDN博客 更多關于 MSYS2 開發環境的配置&#xff0c;請查看往期筆記。 簡介 本筆記將記錄我們在 MSYS2 的 MinGW64 環境中安裝 Pytho…

ubuntu添加域名解析服務器地址

在 Ubuntu 中配置域名解析主要有兩種方式&#xff1a;靜態修改 /etc/hosts 文件 和 動態修改 DNS 解析服務器配置。以下是詳細操作指南&#xff1a; 建議優選:二、永久方案&#xff1a;修改 DNS 解析服務&#xff08;推薦&#xff09;中的方法1 一、臨時方案&#xff1a;修改…

通過 AIOps 、生成式 AI 和機器學習實現更智能的可觀測性

支持 AIOps 的理由 人工智能運維&#xff08;AIOps&#xff09;是將人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&#xff09;和分析技術應用于提升 IT 運維團隊日常工作的過程。簡單來說&#xff0c;AIOps 是軟件系統通過 AI 和 ML 以及相關分析技術來簡化和…

【DataWhale組隊學習】AI辦公實踐與應用

AI辦公-PPT制作 1. 使用大模型制作PPT的常見流程 使用大模型生成PPT的文稿將文稿的內容喂給可以直接生成PPT的大模型&#xff0c;生成PPT 2. 使用大模型生成PPT文稿 我們可以先使用上一章提過的那些大模型去生成一個PPT的文稿。那根據上一章的內容&#xff0c;我們想要去讓…

人機融合智能 | 人智交互中的機器行為設計與管理

以人工智能為代表的科學技術正在深入地塑造和改變著人類的社會、文化和經濟等,在“無所不在的算法與智能”的時代,了解智能機器的行為對于設計智能行為并使其造福于人類,對于智能機器的設計者、開發者和使用者,都具有重要意義。機器行為研究從學科交叉的視角,將智能機器行為置于…

langChainv0.3學習筆記(高級篇)

目錄 工具創建工具從函數創建工具tool 裝飾器結構化工具 從可運行對象創建工具子類化 BaseTool如何創建異步工具處理工具錯誤返回工具執行的artifact 使用內置工具和工具包自定義默認工具如何使用內置工具包 使用聊天模型調用工具定義工具模式Python 函數LangChain 工具Pydanti…

UiAutomator2 與 Appium 對比分析:安卓自動化測試框架的選擇指南

目錄 一、基礎介紹UiAutomator2Appium 二、功能對比三、架構差異UiAutomator2 架構簡圖&#xff1a;Appium 架構簡圖&#xff1a; 四、使用場景分析五、優缺點總結UiAutomator2 優點&#xff1a;UiAutomator2 缺點&#xff1a;Appium 優點&#xff1a;Appium 缺點&#xff1a; …

缺失的第一個正整數

繼續每日一題 今天給大家帶來一道將數組視為哈希表的算法 題目描述&#xff1a; 給你一個未排序的整數數組 nums &#xff0c;請你找出其中沒有出現的最小的正整數。 請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。 題目示例&#xff1a; 由于題目要求…

單例模式-Python示例

單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是設計模式中一種創建型模式&#xff0c;廣泛應用于軟件開發中。一以下以故事化的方式&#xff0c;結合詳細的技術講解&#xff0c;介紹單例模式的背景、定義、適用場景&#xff0c;并提供python的示例代碼。 故事…

啥是 SaaS

https://www.youtube.com/watch?vnpcL7oRZQlI這個視頻講了什么東西&#xff0c; 什么 idea?好的&#xff0c;這個視頻內容非常棒&#xff0c;信息量很足。下面為你詳細總結視頻講了什么&#xff0c;以及核心的 Idea 是什么。 視頻核心 Idea 這個視頻講的是一位名叫 Leandro…

Spring Boot 工程啟動以后,我希望將數據庫中已有的固定內容,打入到 Redis 緩存中,請問如何處理?

在 Spring Boot 工程中&#xff0c;將數據庫中的固定內容預先加載到 Redis 緩存中可以通過以下步驟實現。這里假設你已經配置好了 Spring Data Redis 和數據庫&#xff08;如 MySQL&#xff09;的連接。 1. 添加依賴 首先&#xff0c;確保你的 pom.xml&#xff08;Maven&…

springboot企業級項目開發之項目測試——集成測試!

集成測試 集成測試是指項目代碼在單元測試完成后進行的第二階段測試。集成測試的重點是在集成組件或單元之間交互時暴露缺陷&#xff0c;以保證不同模塊之間相互調用的正確性。在Spring Boot的項目集成測試中&#xff0c;將測試Controller和Dao的完整請求處理。應用程序在服務…

HTML 媒體(Media)

HTML 媒體&#xff08;Media&#xff09; 引言 HTML 媒體元素是構成現代網頁的重要組成部分&#xff0c;它允許我們在網頁中嵌入各種類型的媒體內容&#xff0c;如音頻、視頻、圖像等。這些元素不僅豐富了網頁的視覺效果&#xff0c;還提升了用戶體驗。本文將詳細介紹 HTML 媒…

輕量化分布式AGI架構:基于區塊鏈構建終端神經元節點的互聯網智腦

一、架構概述 該架構通過將終端設備&#xff08;如手機、IoT設備&#xff09;轉化為神經元節點&#xff0c;結合區塊鏈技術構建去中心化智能網絡&#xff0c;形成“互聯網智腦”。其核心在于突破傳統AGI算力瓶頸&#xff0c;實現數據安全共享與價值分配。 1.1 關鍵特征 分布…

【知識圖譜構建系列6】:借了張顯卡先跑著

文章目錄 前情提要mistral模型運行代碼前情提要 之前咱對LLM4KGC的代碼稍作修改,目標是用modelscope來下載模型。 現在這個代碼終于能跑了。 前面咱說,我們的顯卡只有6G的顯存。現在呢,我也成功借到了A100的顯卡。這下,咱可以先跑跑這個項目默認帶的mistral模型。 mist…