網站首頁 編程語言 正文
CPP參考:(新標準)
傳送門
模板對于類型的約束:
約束 template_get_size 泛型T只允許接受類型:list<T>,其實為 C/C++ 泛型模板例化特性,但與泛型模板例化略微有些區別,因為是帶泛型類型約束條件的特例化。
template<typename T>
class list {
public:
int count = 0;
};
template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<list<T> > {
inline std::size_t size(list<T>& v) {
return v.count;
}
};
int main(int argc, const char* argv[]) noexcept {
list<int> list_;
list_.count = 100;
template_get_size<list<int> > list_get_size_;
printf("%d\n", list_get_size_.size(list_));
return 0;
}
但,template_get_size<int> 仍然可以嘗試編譯,從語法層面沒有問題,但會編譯失敗,原因:C/C++ 使用不完整的類型。
人們無法在編譯期間來增加更多檢查約束的有效性。
例一:
template<typename T>
struct template_get_size {
static_assert(false, "Type constraints of generic templates are violated.");
};
例二:
template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<T> {
static_assert(false, "Type constraints of generic templates are violated.");
};
上述適用于泛型模板類/結構體,同理泛型模板函數仍可以增加泛型約束,只是沒有辦法向模板類型一樣可以明確的約束T到底需要是什么類型,這取決于模板函數內部的實現,根代碼粘合劑差不多,但不意味著不能精確限制那些T類型。
泛型模板類型例化:
class A {};
class B : public A {};
template<typename T>
class say;
template<>
class say<A> {};
例如:人們需要T是一個指針,那么有以下幾種方法約束:
案例一:
template<typename T>
void foo(const T* v) {}
案例二:
template<typename T>
void foo(const T& v) {
typedef typename std::remove_pointer<T>::type element_type;
element_type* p = NULL;
}
如果:
人們需要T是一個基類,那么這種似乎不需要模板來實現,如果是模板大約是這樣的形式:
約束T必須是A類或其派生類型,但使用該模板函數的開放人員只有兩個途徑搞清楚T到底被約束為什么。
即:1、函數注釋上明確T的約束類型,2、查看模板函數的內部實現,不像C#中明確為泛型模板類型 T 增加顯示一致性的 where T 約束條件。
class A {};
class B : public A {};
template<typename T>
void foo(const T* v) {
A* a = const_cast<T*>(v);
}
int main(int argc, const char* argv[]) noexcept {
B b;
foo(&b);
return 0;
}
一個好的建議是:
每個泛型模板的類型約束都應在類型/函數注釋上明確指出,這樣使用模板的開發人員不需要嘗試預編譯代碼或閱讀模板代碼實現來判定模板代碼約束條件。
原文鏈接:https://blog.csdn.net/liulilittle/article/details/126941932
相關推薦
- 2022-10-05 Android開發Activity毛玻璃背景效果_Android
- 2023-01-05 TensorFlow?2.0之后動態分配顯存方式_python
- 2022-12-24 TS裝飾器bindThis優雅實現React類組件中this綁定_React
- 2023-12-11 Spring依賴注入DI
- 2023-10-10 Object.defineProperty和Proxy分別實現響應式原理的簡單示例
- 2022-07-19 分布式事務其中的那些坑
- 2023-04-07 Redux?saga異步管理與生成器詳解_React
- 2023-01-13 C#實現顯示CPU使用率與內存使用率_C#教程
- 最近更新
-
- 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同步修改后的遠程分支