C++ 编译期多态的静态成员函数实战实现
代码中,我们为不同的形状(圆形、矩形、三角形)创建了不同的模板特化版本,每个版本都实现了相同名称的静态成员函数,但具有不同的行为。C++ 中的编译期多态可以通过模板特化来实现,这是一种静态多态机制,与动态多态(基于虚函数)不同,它在编译时就确定了具体调用的函数版本。class Shape<std::pair<double, double>> { // 用pair表示矩形(宽, 高)// 静态成员函
C++ 中的编译期多态可以通过模板特化来实现,这是一种静态多态机制,与动态多态(基于虚函数)不同,它在编译时就确定了具体调用的函数版本。
下面是一个使用模板特化实现编译期多态的静态成员函数示例:
C++编译期多态的静态成员函数实现
#include <iostream>
#include <string>
// 基础模板类
template <typename T>
class Shape {
public:
// 静态成员函数,将在特化版本中实现不同行为
static std::string getName();
static double calculateArea(...); // 使用省略号接受任意参数
};
// 圆形特化
template <>
class Shape<double> { // 用double表示圆形(半径)
public:
static std::string getName() {
return "Circle";
}
static double calculateArea(double radius) {
return 3.14159 * radius * radius;
}
};
// 矩形特化
template <>
class Shape<std::pair<double, double>> { // 用pair表示矩形(宽, 高)
public:
static std::string getName() {
return "Rectangle";
}
static double calculate calculateArea(double width, double height) {
return width * height;
}
};
// 三角形特化
template <>
class Shape<int> { // 用int表示三角形(这里仅作示例)
public:
static std::string getName() {
return "Triangle";
}
static double calculateArea(double base, double height) {
return 0.5 * base * height;
}
};
// 演示编译期多态的使用
int main() {
// 编译时就确定了调用哪个版本的函数
std::cout << "Shape 1: " << Shape<double>::getName()
<< ", Area: " << Shape<double>::calculateArea(5.0) << std::endl;
std::cout << "Shape 2: " << Shape<std::pair<double, double>>::getName()
<< ", Area: " << Shape<std::pair<double, double>>::calculateArea(4.0, 6.0) << std::endl;
std::cout << "Shape 3: " << Shape<int>::getName()
<< ", Area: " << Shape<int>::calculateArea(3.0, 4.0) << std::endl;
return 0;
}
这个实现展示了编译期多态的几个关键特点:
- 模板特化:通过对基础模板类进行不同类型的特化,实现了不同的行为
- 静态绑定:编译器在编译时就确定了要调用哪个版本的静态成员函数
- 零运行时开销:与动态多态(虚函数)不同,编译期多态不需要虚函数表,也没有动态绑定的开销
- 类型安全:在编译时就能检查出类型不匹配的错误
代码中,我们为不同的形状(圆形、矩形、三角形)创建了不同的模板特化版本,每个版本都实现了相同名称的静态成员函数,但具有不同的行为。当我们使用Shape<double>::calculateArea()
时,编译器会在编译时就确定调用圆形的面积计算方法。
这种技术在标准库中也有广泛应用,例如std::swap
的不同特化版本针对不同类型提供了最优实现。
401q.8dsi1.cn
401w.8dsi2.cn
401e.8dsi3.cn
401r.8dsi4.cn
401t.8dsi5.cn
401y.8dsi6.cn
401u.8dsi7.cn
401i.8dsi8.cn
401o.8dsi9.cn
401p.8dsi10.cn
401a.8dsi1.cn
401s.8dsi2.cn
401d.8dsi3.cn
401f.8dsi4.cn
401g.8dsi5.cn
401h.8dsi6.cn
401j.8dsi7.cn
401k.8dsi8.cn
401l.8dsi9.cn
401z.8dsi10.cn
401x.8dsi1.cn
401c.8dsi2.cn
401v.8dsi3.cn
401b.8dsi4.cn
401n.8dsi5.cn
401m.8dsi6.cn
402q.8dsi7.cn
402w.8dsi8.cn
402e.8dsi9.cn
402r.8dsi10.cn
402t.8dsi1.cn
402y.8dsi2.cn
402u.8dsi3.cn
402i.8dsi4.cn
402o.8dsi5.cn
402p.8dsi6.cn
402a.8dsi7.cn
402s.8dsi8.cn
402d.8dsi9.cn
402f.8dsi10.cn
402g.8dsi1.cn
402h.8dsi2.cn
402j.8dsi3.cn
402k.8dsi4.cn
402l.8dsi5.cn
402z.8dsi6.cn
402x.8dsi7.cn
402c.8dsi8.cn
402v.8dsi9.cn
402b.8dsi10.cn
402n.8dsi1.cn
402m.8dsi2.cn
403q.8dsi3.cn
403w.8dsi4.cn
403e.8dsi5.cn
403r.8dsi6.cn
403t.8dsi7.cn
403y.8dsi8.cn
403u.8dsi9.cn
403i.8dsi10.cn
403o.8dsi1.cn
403p.8dsi2.cn
403a.8dsi3.cn
403s.8dsi4.cn
403d.8dsi5.cn
403f.8dsi6.cn
403g.8dsi7.cn
403h.8dsi8.cn
403j.8dsi9.cn
403k.8dsi10.cn
403l.8dsi1.cn
403z.8dsi2.cn
403x.8dsi3.cn
403c.8dsi4.cn
403v.8dsi5.cn
403b.8dsi6.cn
403n.8dsi7.cn
403m.8dsi8.cn
404q.8dsi9.cn
404w.8dsi10.cn
404e.8dsi1.cn
404r.8dsi2.cn
404t.8dsi3.cn
404y.8dsi4.cn
404u.8dsi5.cn
404i.8dsi6.cn
404o.8dsi7.cn
404p.8dsi8.cn
404a.8dsi9.cn
404s.8dsi10.cn
404d.8dsi1.cn
404f.8dsi2.cn
404g.8dsi3.cn
404h.8dsi4.cn
404j.8dsi5.cn
404k.8dsi6.cn
404l.8dsi7.cn
404z.8dsi8.cn
404x.8dsi9.cn
404c.8dsi10.cn
404v.8dsi1.cn
404b.8dsi2.cn
404n.8dsi3.cn
404m.8dsi4.cn
405q.8dsi5.cn
405w.8dsi6.cn
405e.8dsi7.cn
405r.8dsi8.cn
405t.8dsi9.cn
405y.8dsi10.cn
405u.8dsi1.cn
405i.8dsi2.cn
405o.8dsi3.cn
405p.8dsi4.cn
405a.8dsi5.cn
405s.8dsi6.cn
405d.8dsi7.cn
405f.8dsi8.cn
405g.8dsi9.cn
405h.8dsi10.cn
405j.8dsi1.cn
405k.8dsi2.cn
405l.8dsi3.cn
405z.8dsi4.cn
405x.8dsi5.cn
405c.8dsi6.cn
405v.8dsi7.cn
405b.8dsi8.cn
405n.8dsi9.cn
405m.8dsi10.cn
406q.8dsi1.cn
406w.8dsi2.cn
406e.8dsi3.cn
406r.8dsi4.cn
406t.8dsi5.cn
406y.8dsi6.cn
406u.8dsi7.cn
406i.8dsi8.cn
406o.8dsi9.cn
406p.8dsi10.cn
406a.8dsi1.cn
406s.8dsi2.cn
406d.8dsi3.cn
406f.8dsi4.cn
406g.8dsi5.cn
406h.8dsi6.cn
406j.8dsi7.cn
406k.8dsi8.cn
406l.8dsi9.cn
406z.8dsi10.cn
406x.8dsi1.cn
406c.8dsi2.cn
406v.8dsi3.cn
406b.8dsi4.cn
406n.8dsi5.cn
406m.8dsi6.cn
407q.8dsi7.cn
407w.8dsi8.cn
407e.8dsi9.cn
407r.8dsi10.cn
407t.8dsi1.cn
407y.8dsi2.cn
407u.8dsi3.cn
407i.8dsi4.cn
407o.8dsi5.cn
407p.8dsi6.cn
407a.8dsi7.cn
407s.8dsi8.cn
407d.8dsi9.cn
407f.8dsi10.cn
407g.8dsi1.cn
407h.8dsi2.cn
407j.8dsi3.cn
407k.8dsi4.cn
407l.8dsi5.cn
407z.8dsi6.cn
407x.8dsi7.cn
407c.8dsi8.cn
407v.8dsi9.cn
407b.8dsi10.cn
407n.8dsi1.cn
407m.8dsi2.cn
408q.8dsi3.cn
408w.8dsi4.cn
408e.8dsi5.cn
408r.8dsi6.cn
408t.8dsi7.cn
408y.8dsi8.cn
408u.8dsi9.cn
408i.8dsi10.cn
408o.8dsi1.cn
408p.8dsi2.cn
408a.8dsi3.cn
408s.8dsi4.cn
408d.8dsi5.cn
408f.8dsi6.cn
408g.8dsi7.cn
408h.8dsi8.cn
408j.8dsi9.cn
408k.8dsi10.cn
更多推荐
所有评论(0)