C++泛型模板約束深入講解
CPP參考:(新標(biāo)準(zhǔn))
模板對(duì)于類(lèi)型的約束:
約束 template_get_size 泛型T只允許接受類(lèi)型:list<T>,其實(shí)為 C/C++ 泛型模板例化特性,但與泛型模板例化略微有些區(qū)別,因?yàn)槭菐Х盒皖?lèi)型約束條件的特例化。
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> 仍然可以嘗試編譯,從語(yǔ)法層面沒(méi)有問(wèn)題,但會(huì)編譯失敗,原因:C/C++ 使用不完整的類(lèi)型。
人們無(wú)法在編譯期間來(lái)增加更多檢查約束的有效性。
例一:
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.");
};上述適用于泛型模板類(lèi)/結(jié)構(gòu)體,同理泛型模板函數(shù)仍可以增加泛型約束,只是沒(méi)有辦法向模板類(lèi)型一樣可以明確的約束T到底需要是什么類(lèi)型,這取決于模板函數(shù)內(nèi)部的實(shí)現(xiàn),根代碼粘合劑差不多,但不意味著不能精確限制那些T類(lèi)型。
泛型模板類(lèi)型例化:
class A {};
class B : public A {};
template<typename T>
class say;
template<>
class say<A> {};例如:人們需要T是一個(gè)指針,那么有以下幾種方法約束:
案例一:
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是一個(gè)基類(lèi),那么這種似乎不需要模板來(lái)實(shí)現(xiàn),如果是模板大約是這樣的形式:
約束T必須是A類(lèi)或其派生類(lèi)型,但使用該模板函數(shù)的開(kāi)放人員只有兩個(gè)途徑搞清楚T到底被約束為什么。
即:1、函數(shù)注釋上明確T的約束類(lèi)型,2、查看模板函數(shù)的內(nèi)部實(shí)現(xiàn),不像C#中明確為泛型模板類(lèi)型 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;
}一個(gè)好的建議是:
每個(gè)泛型模板的類(lèi)型約束都應(yīng)在類(lèi)型/函數(shù)注釋上明確指出,這樣使用模板的開(kāi)發(fā)人員不需要嘗試預(yù)編譯代碼或閱讀模板代碼實(shí)現(xiàn)來(lái)判定模板代碼約束條件。
到此這篇關(guān)于C++泛型模板約束深入講解的文章就介紹到這了,更多相關(guān)C++泛型模板約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
在vs2017上配置AppGameKit庫(kù)的圖文教程
這篇文章主要介紹了在vs2017上配置AppGameKit庫(kù)的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

