赞
踩
C++ 类模板是一种通用的类或函数的模板,它可以用来创建支持不同数据类型的通用类或函数。类模板可以在编译时生成特定类型的类或函数,使得代码可以更加灵活和可重用。
使用场景:
优缺点:
优点:
缺点:
举例:
- // 定义一个简单的类模板
- template <class T>
- class Pair {
- private:
- T first, second;
- public:
- Pair(T a, T b) : first(a), second(b) {}
- T getFirst() { return first; }
- T getSecond() { return second; }
- };
-
- int main() {
- // 实例化一个Pair类模板,支持int类型
- Pair<int> intPair(1, 2);
- cout << intPair.getFirst() << ", " << intPair.getSecond() << endl;
-
- // 实例化一个Pair类模板,支持double类型
- Pair<double> doublePair(3.14, 2.7);
- cout << doublePair.getFirst() << ", " << doublePair.getSecond() << endl;
-
- return 0;
- }

++ 类模板容易出错的点有很多,主要包括以下几个方面。
为了避免这些问题,可以采用以下措施:
举个例子:在以下的代码中,我们定义了一个List类模板,但其中有一个错误。在该模板类定义中,我们在成员函数std::list::find()的实现中使用了类型T的递增运算符“++”。但是,T类型可能是不支持递增运算符的类型(例如自定义结构体类型)。因此,编译会报错,我们需要在实现中添加类型约束(要求T类型必须支持递增运算符)来避免这个错误。
- #include <list>
- using namespace std;
-
- template <typename T>
- class List {
- public:
- typedef typename std::list<T>::iterator iterator;
- bool contains(const T& value) const { return (list_.end() != find(value)); }
- private:
- list<T> list_;
- iterator find(const T& value) const {
- return std::find(list_.begin(), list_.end(), value);
- }
- };
要解决这个问题,我们可以在类模板定义中使用类型约束(type constraints)来要求T类型必须支持递增运算符,如下所示:
- template <typename T>
- class List {
- public:
- // 要求T类型必须支持递增运算符,否则编译会报错
- static_assert(std::is_same<decltype(++std::declval<T>()), T&>::value,
- "T must support prefix increment operator (++T)");
-
- typedef typename std::list<T>::iterator iterator;
- bool contains(const T& value) const { return (list_.end() != find(value)); }
- private:
- list<T> list_;
- iterator find(const T& value) const {
- return std::find(list_.begin(), list_.end(), value);
- }
- };
这样,当使用不支持递增运算符的类型实例化该模板类时,编译器会产生编译错误,在编写代码时可以及时发现并修改这个问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。