前言:作为C++泛型编程的核心设施,模板机制提供了强大的抽象能力,但只有深入理解其高阶特性才能真正释放潜力。本文将系统解析非类型模板参数、类模板特化和模板分离编译这三大关键技术,揭示它们如何共同构建STL级别的组件
目录
一、模板参数
模板(Template):是泛型编程的核心机制,允许在编写代码时使用参数化的类型或值,从而实现代码的复用。
模板的参数分为两大类:类型参数和非类型参数,此外还有 模板模板参数(较少见)
typename的作用
typename 通常出现在模板中,与 class 可以自由更换,例如:
template<class T, typename T>
但是在涉及依赖类型的场景中必须使用
typename关键字。特别是在处理容器迭代器时,这是一个非常典型的应用场景。
当我们需要打印模板化容器中的元素时,正确的迭代器声明必须使用typename:
#include<iostream>
#include <vector>
using namespace std;
template <typename Container>
void printContainer(const Container& cont) {
// 必须使用typename指明Container::const_iterator是类型而非静态成员
typename Container::const_iterator it = cont.begin();
for (; it != cont.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
#include <vector>
#include <list>
int main() {
// 示例:使用vector
vector<int> vec = { 1, 2, 3, 4, 5 };
cout << "Vector elements: ";
printContainer(vec);
return 0;
}

typename在此场景的必要性源于C++的模板解析两阶段处理:
第一阶段(模板定义时):编译器尚不知Container的具体类型
第二阶段(模板实例化时):才确定Container::const_iterator是类型还是静态成员默认情况下,编译器假定依赖名称(Container::const_iterator)是值而非类型,必须用typename显式指示这是类型名称。
非类型参数
模板参数分类类型形参与非类型形参。
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
顾名思义,这个参数不是类模板参数(class T 或者 typename T)
这种参数可以是(我们暂时只学整型,其它类型也是同样的用法)
整型(包括 int, char, long 等)
枚举类型(enum)
C++模板高级应用详解

最低0.47元/天 解锁文章
1372

被折叠的 条评论
为什么被折叠?



