引言
在日常工作摸索中,发现模板函数和宏定义函数是C++中两个简化代码的利器,可以避免大多数重复代码,节省了手指头的消耗(手动狗头)。基于好东西要分享的基本准则,这里就模板函数的使用和实现机制进行简单梳理。
例子
如上图所示,界面上有多数需要设置最大、最小值的情况,代码如下:
{
int maxVal=100, minVal=1, val=50;
auto horizontalSlider = new QSlider(Qt::Horizontal, this);
auto spinBox = new QSpinBox(this);
auto horizontalSlider1 = new QSlider(Qt::Horizontal, this);
auto spinBox1 = new QSpinBox(this);
horizontalSlider->setMaximum(maxVal);
horizontalSlider->setMinimum(minVal);
horizontalSlider->setValue(val);
spinBox->setMaximum(maxVal);
spinBox->setMinimum(minVal);
spinBox->setValue(val);
horizontalSlider1->setMaximum(maxVal);
horizontalSlider1->setMinimum(minVal);
horizontalSlider1->setValue(val);
spinBox1->setMaximum(maxVal);
spinBox1->setMinimum(minVal);
spinBox1->setValue(val);
}
上述代码中有大量重复代码段,但存在有两种不同类型,此时可以通过模板函数的形式,提炼公共函数使用,如下所示:
template<typename WidgetType>
void setValLimit(WidgetType* tmpWidget, int val, int maxVal, int minVal){
tmpWidget->setMaximum(maxVal);
tmpWidget->setMinimum(minVal);
tmpWidget->setValue(val);
}
{
int maxVal=100, minVal=1, val=50;
auto horizontalSlider = new QSlider(Qt::Horizontal, this);
auto spinBox = new QSpinBox(this);
auto horizontalSlider1 = new QSlider(Qt::Horizontal, this);
auto spinBox1 = new QSpinBox(this);
setValLimit(horizontalSlider, val, maxVal, minVal);
setValLimit(spinBox, val, maxVal, minVal);
setValLimit(horizontalSlider1, val, maxVal, minVal);
setValLimit(spinBox1, val, maxVal, minVal);
}
实现机制
模板函数在我们看来是一个函数,但在具体实现时是由编译器生成了多个不同类型的函数
以上述代码为例,实际编译器处理后的代码如下:
void setValLimit(QSlider* tmpWidget, int val, int maxVal, int minVal){
tmpWidget->setMaximum(maxVal);
tmpWidget->setMinimum(minVal);
tmpWidget->setValue(val);
}
void setValLimit(QSpinBox* tmpWidget, int val, int maxVal, int minVal){
tmpWidget->setMaximum(maxVal);
tmpWidget->setMinimum(minVal);
tmpWidget->setValue(val);
}
编译器会对函数模板进行两次编译,第一次是在声明处,第二次是在调用处。编译器在函数调用处根据所传递的参数,为我们生成了参数分别为QSlider* 和QSpinBox* 的两个函数,用于调用。
|