重载确定

本文通过一个具体的 C++ 程序示例介绍了函数重载的概念及使用方式。详细展示了如何定义多个同名但参数不同的函数,并演示了在主函数中调用这些重载函数的过程。
#include <iostream>

using namespace std;

void f(){cout << "f()" << endl;}
void f(int a) {cout << "f(int a)" << endl;}
void f(int a, int b) {cout << "f(int a, int b)" << endl;}
void f(double a, double b = 3.11) { cout << "f(double a, double b = 3.11)" << endl;}
void d() { cout << "d()" << endl;}
void g(int a) { cout << "g(int a)" << endl;}
int main ()
{
	f(8); // f(int a)位输出,
	f(3.5); // 可行函数是 f(int a)和 f(double a, double b = 3.11)后者为最佳匹配,
    //f(42,6.1); // 这是两个有重载相异性的二异性,出错,
	f(static_cast<double> (42),2.34); // 强制将42转型为double类型,

	return 0;
}

在 Qt 中,信号(signal)的重载是通过参数类型和数量的不同来区分的。当一个信号存在多个重载版本时,Qt 提供了几种方式来明确指使用哪一个信号版本[^3]。 ### 通过 QOverload 明确指信号重载版本 Qt5 引入了 `QOverload` 模板类来帮助开发者处理信号的重载问题。`QOverload` 可以根据参数类型来选择对应的信号版本,从而避免编译器无法正确推断出应使用哪一个重载信号的问题。 例如,当一个信号 `sgnTest1` 存在两个重载版本,分别接受一个 `int` 和两个 `int` 参数时,可以通过以下方式连接信号和槽: ```cpp connect(this, QOverload<int>::of(&TestManager::sgnTest1), this, QOverload<int>::of(&TestManager::slotTest1)); connect(this, QOverload<int, int>::of(&TestManager::sgnTest1), this, QOverload<int, int>::of(&TestManager::slotTest1)); ``` 这种方式通过 `QOverload<参数类型>::of(函数指针)` 的形式获取特重载版本的函数指针,从而明确指信号的版本[^3]。 ### 使用函数指针明确指信号版本 另一种方法是显式地声明一个函数指针指向特的信号版本。例如: ```cpp void (QSpinBox::*spinBoxValueChanged)(int) = &QSpinBox::valueChanged; connect(ui->spinBox, spinBoxValueChanged, [=](){ /* ... */ }); ``` 通过将信号的地址赋值给具有特参数类型的函数指针,可以明确告诉编译器应该选择哪一个信号版本[^4]。 ### 使用旧式 SIGNAL/SLOT 语法指信号重载 Qt 还支持一种旧式的 `SIGNAL()` 和 `SLOT()` 宏语法来连接信号和槽,这种方式也可以处理信号重载: ```cpp connect(this, SIGNAL(sgnTest1(int)), this, SLOT(slotTest1(int))); connect(this, SIGNAL(sgnTest1(int, int)), this, SLOT(slotTest1(int, int))); ``` 这种写法直接在宏中指参数类型,从而明确信号的重载版本。尽管这种方式在现代 Qt 开发中不推荐使用,但在某些情况下仍然有效且方便。 ### 总结 Qt 中确定信号重载的方式主要包括使用 `QOverload`、函数指针以及旧式的 `SIGNAL/SLOT` 宏语法。每种方式都有其适用场景,其中 `QOverload` 是现代 Qt 推荐的做法,因其类型安全且易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值