泛型

伪代码例子

類　例泛類<T> {
　　值 : T

　　設置值(新值: T) {
　　　　值 := 新值}

　　獲取值() : T {
　　　　返回　值}
}

例方法1() {
　　例物件: 例泛類<整數型>
　　例物件:= 新　例泛類<整數型>()
　　例物件.設置值(5)
　　输出整数(例对象.获取值())
}

例方法2() {
　　例物件: 例泛類<浮點數型>
　　例物件:= 新　例泛類<浮點數型>()
　　例物件.設置值(5.5)
　　输出浮点数(例对象.获取值())
}
在这例子中，例泛类是一个泛型，而T是一个类型参数。在例泛类中没指明T的实际类型，只有例方法1()和例方法2()在使用例泛类时才加以指明。
运行这例子的例方法1()将输出整数5，而运行例方法2()将输出浮点数5.5。

C++的泛型（模板）

C++ 泛型的参数可以代表类或个别对象。在一般意义上，C++ 缺乏对泛型的类型参数进行直接约束的手段，但可利用SFINAE（模板代换失败非错误，指在模板实例化过程中的错误仅意味此次代换失败，并不一定产生编译错误）规则及C++11 的 static_assert 等实现相似功能。
#include <type_traits>class B{...};class D: public B{...};template<typename T>void SFINAE(const std::enable_if_t<std::is_base_of<B, T>::value, T> &t);template<typename T>void STATIC_ASSERT(const T &t){
    static_assert(std::is_pod<T>::value, "Use with POD types only!");}
如上所示，std::enable_if（std::enable_if_t<boolean, Type> 是 std::enable_if<boolean, Type>::type 的缩写）利用 SFINAE 规则来实现模板类型参数约束的手段之一。其实现方式是若布尔判断为假，则把类型设为void，而这将导致const void & 这种不合法的类型出现，从而禁止这种类型参数的使用。
static_assert 则在布尔判断失败时把后面的字符串作为消息内容报告为编译错误。
在编译时，每个被使用的封闭泛型类型（即是所有泛型参数的实际类型都已被指明的泛型）都会有独立的编码产生，编译程序会在此时确保类型安全性。可是如果泛型要运用其泛型参数的某成员，而该泛型参数又不包含该成员的时候，编译程序所产生的错误信息或会看似与实际问题无关，增加调试的难度。