Code Bye

讨教一下Qt里面的std::function std::bind

最近重新在学习Qt,看到了一个用Qt写的天气预报例子。
里面用到了一些std::function  std::bind的地方,有点似是而非,讨教一下大家。
这是管理获取城市列表,天气的一个类。
typedef std::function<void (const QStringList &strList)> OnMessage;  //这里定义了这么一个函数.
class CityManager : public QObject
{
Q_OBJECT
public:
CityManager(QObject *parent = 0);
void getSupportProvince(const OnMessage &msg);
void getSupportCity(const QString &provinceName, const OnMessage &msg);

private slots:
void replyFinished(QNetworkReply *);
private:
QNetworkAccessManager *net_;
OnMessage onMessage_;
};
然后,实现函数里面都这样使用的。
void CityManager::getSupportProvince(const OnMessage &msg)
{
onMessage_ = msg;  //这里是把当成了函数指针?
QUrl url(“http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportProvince?”);
QNetworkRequest request(url);
net_->get(request);
}
void CityManager::replyFinished(QNetworkReply *reply)
{
……
while (!reader.atEnd()) {
reader.readNext();
if (reader.isStartElement()) {
if (reader.name() == “string”) {
list.append(reader.readElementText());
}
}
}
if (onMessage_) {
onMessage_(list);
}

}
void Dialog::onProvinces(const QStringList &strList)
{
QStringList::const_iterator citer = strList.constBegin();
for ( ; citer != strList.constEnd(); ++citer) {
ui->provinces->addItem(*citer);
}
ui->provinces->setCurrentIndex(0);
cityManager_.getSupportCity(ui->provinces->currentText(), std::bind(&Dialog::onCitys, this, std::placeholders::_1));
}
//这里,本人看到又用std::bind来绑定了dialog里面的onProvinces函数,这里是不是说list已经被 onMessage获取了?
cityManager_.getSupportProvince(std::bind(&Dialog::onProvinces, this, std::placeholders::_1));
有点乱,就是不是很理解list是怎么从replyfinished里面获取的。

解决方案

50

这是c++的标准库
std::function是个类,它把函数指针和部分参数保存下来,然后用他的operator()可以调用它保存的函数
它是个可拷贝的对象
std::bind是一个函数,用于生成一个绑定了部分参数的std::function,std::placeholders用于指定空出的参数位置

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨教一下Qt里面的std::function std::bind