日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++泛型模板約束深入講解_C 語言

作者:liulilittle ? 更新時間: 2022-11-11 編程語言

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

欄目分類
最近更新