C++模板元编程

include

// 函数模板
template
bool equivalent(const T& a, const T& b){
return !(a < b) && !(b < a);
}
// 类模板
template // 默认参数
class bignumber{
T _v;
public:
bignumber(T a) : _v(a) { }
inline bool operator<(const bignumber& b) const; // 等价于 (const bignumber& b)
};
// 在类模板外实现成员函数
template
bool bignumber::operator<(const bignumber& b) const{
return _v < b._v;
}

int main()
{
bignumber<> a(1), b(1); // 使用默认参数,"<>"不能省略
std::cout << equivalent(a, b) << '\n'; // 函数模板参数自动推导
std::cout << equivalent(1, 2) << '\n';
std::cin.get(); return 0;
}

// 实现一个向量类
template<typename T, int N>
class Vec{
T _v[N];
// ... // 模板通例(primary template),具体实现
};
template<>
class Vec<float, 4>{
float _v[4];
// ... // 对 Vec<float, 4> 进行专门实现,如利用向量指令进行加速
};
template
class Vec<bool, N>{
char _v[(N+sizeof(char)-1)/sizeof(char)];
// ... // 对 Vec<bool, N> 进行专门实现,如用一个比特位表示一个bool
};
template<typename T, int i> class cp00; // 用于模板型模板参数
// 通例
template<typename T1, typename T2, int i, template<typename, int> class CP>
class TMP;
// 完全特例化
template<>
class TMP<int, float, 2, cp00>;
// 第一个参数有const修饰
template<typename T1, typename T2, int i, template<typename, int> class CP>
class TMP<const T1, T2, i, CP>;
// 第一二个参数为cp00的实例且满足一定关系,第四个参数为cp00
template<typename T, int i>
class TMP<cp00<T, i>, cp00<T, i+10>, i, cp00>;
// 编译错误!,第四个参数类型和通例类型不一致
//template<template CP>
//class TMP<int, float, 10, CP>;

|dystart|RVVAWkZURFpGVUVaRldDUFBGUA==|dyend|
|dys|RVVAWkZURFpGVUVaRldDUFBUQ0daV0JDWldDQlpXQURQQUJER0tBRUNLQURCS0FGREFXRURWXUZFUl1GRFNdRkZVV1BFVUBaRlREWkZVRVpGV0M=|dye|

posted @ 2025-12-15 09:11  annie1991  阅读(0)  评论(0)    收藏  举报