模板(templates) 是C++的一种机制,允许创建通用类和函数,可以与不同的数据类型一起使用,而无需重复代码。这是实现STL容器、算法以及许多通用编程模式的基础。
模板类型:
类模板示例:
template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };
函数模板示例:
template<class T> T add(const T& a, const T& b) { return a + b; }
可以仅显式特化模板类的一个方法,而无需特化整个类吗?如果可以,怎么做到的?
答复:
可以。不必特化整个类;只需特化单独的方法:
template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // 仅对int特化bar方法 // 实现 }
故事
在项目中编写了一个比较函数的模板:template <typename T> bool cmp(const T& a, const T& b) { return a < b; }当与没有
<运算符的类型一起使用时,出现了编译错误,这个错误被困扰了很久,因为诊断信息仅在实例化模板时给出,而不是在其定义时给出。
故事
开发人员试图在模板函数中使用用户定义的类进行加法,但忘记重载+运算符。这导致在首次使用该类时出现编译错误。
故事
在基于类模板开发容器时,编写了一个不依赖于模板类型的方法,但被放置在类的外部而没有显式特化:template<> int MyContainer<int>::size() const { ... }这导致了链接错误,因为特化被声明,但未为所有类型正确实现。