匿名函数也可以被叫做Lambda表达式,自C++11中引入该特性。本文主要介绍Qt里使用到的匿名函数。
//connect to a functor
template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
{
return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection);
}
QPushButton *button = new QPushButton;
connect(button, &QPushButton::clicked, [this]() {
...
});
template <typename RandomAccessIterator, typename LessThan>
QT_DEPRECATED_X("Use std::sort") inline void qSort(RandomAccessIterator start, RandomAccessIterator end, LessThan lessThan)
{
if (start != end)
QAlgorithmsPrivate::qSortHelper(start, end, *start, lessThan);
}
QList<int> list{3, 1, 2};
qSort(list.begin(),
list.end(),
[](int left, int right)->bool {
return left < right;
}
);
template <typename T>
QFuture<T> run(T (*functionPointer)())
{
return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start();
}
QtConcurrent::run([=](){
...
});
void singleShot(int msec, Functor functor)
QTimer::singleShot(1000, [](){
qDebug()<<"Finished!!!";
});
Q_DECLARE_METATYPE(std::function<void ()>)
int main(int argc, char *argv[])
{
std::function<void ()> f = [](){ qDebug()<<"22"; };
QVariant var = QVariant::fromValue(f);
if (var.canConvert<std::function<void ()> >()) {
std::function<void ()> func = var.value<std::function<void ()>>();
func();
}
}
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return fn; // or, since C++11: return move(fn);
}
QList<int> list{1, 2, 3};
std::for_each(list.begin(),
list.end(),
[](int i) {
...
});
关于Qt中更多的匿名函数(Lambda表达式)写法也可以在留言区一起讨论。
关于匿名函数(Lambda表达式)可点击:
关于QVariant与匿名函数的使用可点击: