一、class template定义
#include <vector>
#include <stdexcept>
template <typename T>
class Stack {
private:
std::vector elems;
public:
void push(const T&);
void pop();
T top() const;
bool empty() const {
return elems.empty();
}
};
template <typename T>
void Stack<T>::push(const T& elem)
{
elems.push_back(elem);
}
template <typename T>
void Stack<T>::pop()
{
if (elems.empty())
{
throw std::out_of_range("Stack::pop: empty stack");
}
elems.pop_back();
}
template <typename T>
T Stack<T>::top() const
{
if (elems.empty())
{
throw std::out_of_range("Stack::top: empty stack");
}
return elems.back();
}
二、使用class template
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack1.hpp"
int main()
{
try {
Stack<int> intStack; // stack of ints
Stack<std::string> stringStack; // stack of strings
// manipulate int stack
intStack.push(7);
std::cout << intStack.top() << std::endl;
// manipulate string stack
stringStack.push("hello");
std::cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (std::exception const& ex) {
std::cerr << "Exception: " << ex.what() << std::endl;
return EXIT_FAILURE; // exit program with ERROR status
}
}
代码只有在成员函数被调用时才被具现化。针对类模板而言,成员函数只有在被使用时才会被具现化。如果类模板中包含有静态成员,那些静态成员针对类型只会被实具现化一次。通过类模板具现化的类使用起来与其他类型一样。
对类模板类型参数的唯一要求就是针对类型参数的任何调用必须满足。
三、模板特化
完全特化:特化类型将作为template parameter并在class名称之后直接写明。如
#include <deque>
#include <string>
#include <stdexcept>
#include "stack.hpp"
template<>
class Stack<std::string>
{
private:
std::deque<std::string> elems;
public:
void push(const std::string&);
void pop();
std::string top() const;
bool empty() const {
return elems.empty();
}
};
void Stack<std::string>::push(const std::string& elem)
{
elems.push_back(elem);
}
void Stack<std::string>::pop()
{
if (elems.empty())
{
throw std::out_of_range("Stack<std::string>::pop(): empty stack");
}
elems.pop_back();
}
std::string Stack<std::string>::top() const
{
if (elems.empty())
{
throw std::out_of_range("Stack<std::string>::pop(): empty stack");
}
return elems.back();
}
当模板类针对某个类型参数进行特化时,模板类中的所有成员函数也必须同时提供特化实现。
四、模板偏特化
class template可以被偏特化,这使得在特定情形下使用特殊实现代码,但仍然留出选择template parameter的能力。
template <typename T1, typename T2>
class MyClass {
...
};
//partial specialization: two template parameters are same
template <typename T>
class MyClass<T,T> { ... };
//partial specialization: 2nd template parameter is int
template <typename T>
class MyClass<T,int> { ... };
//partial specialization: two template parameters are pointers
template <typename T1, typename T2>
class MyClass<T1*, T2*> { ... };
五、默认模板参数
template <typename T, typename CONT=std::vector<T> >
class Stack {
private:
CONT elems;
public:
void push(const T&);
void pop();
T top() const;
bool empty() const { return elems.empty() }
};
...
使用带有默认模板参数时,如果与默认模板参数一致,不需要指定;否则需显式指定;如
Stack<double, std::deque<double> >
六:非类型模板类型参数(NON-TYPE TEMPLATE PARAMETER)
非类型参数主要是指值参数而非类型参数,通常是常整数、枚举、或者指向带有外链接对象的指针,浮点数或者class-type对象是不允许作为非类型模板参数的。在使用时,这个非类型模板参数必须显式指定。
小结摘要:
1. 所谓class template是包含一个或者多个尚未确定类型的class。
2. 必须将具体数据类型当做template parameter传入,才能使用class template。 于是该class template才能按照给定的template parameter数据类型,由编译器具现化并编译。
3. class template中,只有实际被调用的成员函数,才会被具现化。
4. 可以针对某些特别类型,对class template进行特化
5. 也可以针对某些特定类型,对class template进行偏特化
6. 可以为template parameter定义默认值
分享到:
相关推荐
1. 类模板(class templates):用于生成类的开头注释,通常包括版权信息、作者、创建日期和描述。 2. 方法模板(method templates):用于生成方法内部的注释,包括参数、返回值、异常和简短描述。 3. 注释模板...
在C++中,模板分为两种主要类型:函数模板(Function Templates)和类模板(Class Templates)。 函数模板允许我们定义一个函数的通用形式,然后编译器会生成一个特定类型的实例版本,这样就不需要为每一种数据类型...
The classic C++ language admits two basic types of templates—function templates and class templates2: Here is a function template: template scalar_t sq(const scalar_t& x) { return x*x; } Here is a ...
2. 类模板(Class Templates) 类模板与函数模板类似,但作用于类的定义上。它定义了一个通用的类结构,可以为多种数据类型创建类实例。例如,我们可以定义一个模板化的栈类(Stack),它可以容纳不同类型的数据元素...
Written for programmers with a background in another high-level language, C++20 for Programmers applies the Deitel signature live-code approach to...Defining custom function templates and class templates
C++的关键特性包括类(Class)、继承(Inheritance)、多重继承(Multiple Inheritance)、运算符重载(Operator Overloading)、类模板(Class Templates)和标准库(Standard Library)。这些特性让C++成为一种...
- **类模板(Class Templates):** 第一部分还涵盖了类模板的相关知识,包括类模板的实现细节,如堆栈实现等。 - **模板元编程(Template Metaprogramming):** 这是高级主题,书中可能会涉及到模板元编程的概念和...
7 Class Templates array and vector;Catching Exceptions 8 Pointers 9 Classes:A Deeper Look 10 Operator Overloading;Class string 11 Object-Oriented Programming:Inheritance 12 Object-Oriented Programming...
Templates: The Hard Way Templates: The C++ Way Function Specialization Class Templates Class Specialization Implementation Details Advanced Features Summary Programming Exercises 25. Standard ...
3. 类模板(Class Templates)允许创建通用的数据结构,例如标准模板库(STL)中的vector、list等。它们同样使用模板参数定义。 4. 标准模板库(STL)是C++标准库中的一个重要组成部分,提供了一系列广泛使用的数据...
- **Class Templates:** Discusses class templates. - **Using STL: string, vector, and complex:** Introduces the STL containers. - **Software Engineering: Reuse and Generics:** Emphasizes reuse and ...
- **类模板(Class Templates)**:用于生成特定类型的类,如实体类、接口类等。 - **文件模板(File Templates)**:定义一个完整文件的结构,包含一个或多个类模板。 - **项目模板(Project Templates)**:一组...
For programmers, who just use templates, who provide class and function templates, and who provide generic and foundation libraries Covering C++11, C++14, and C++17 Explaining all type traits of the ...
模板包括类模板(class templates)、函数模板(function templates)、可变参数模板(variadic templates)等。模板使得代码复用变得更加高效,并且能够产生高度优化的代码。 ### 抽象机制 C++支持面向对象编程和...
五级深入学习模板(function templates、class templates)的使用,理解其在代码复用中的作用,同时学习异常处理机制(try-catch-finally)及异常类型。 6级:STL标准库的使用 六级重点是学习标准模板库(Standard ...
4. **Chapter 09 (ch09)**:讲解了模板(templates),包括函数模板(function templates)和类模板(class templates)。这使得代码可以处理不同类型的数据,实现泛型编程(generic programming)。 5. **Chapter ...
模板可以应用于类(class templates)和函数(function templates),为编写灵活、可重用的代码提供了便利。以下是对每个压缩包子文件中可能包含的知识点的详细解释: 1. **Makefile.h** 和 **Makefile**: 这些文件...