Lambda 表达式递归用法实例

注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的。

Windows下查找子孙窗口实例:

HWND FindDescendantWindows(HWND hWndParent, LPCTSTR lpClassName, LPCTSTR lpWindowName)
{
    HWND hFind = nullptr;

    UINT nCompare = 0;
    nCompare += (lpClassName != nullptr) ? 1 : 0;
    nCompare += (lpWindowName != nullptr) ? 1 : 0;

    if (nCompare == 0)
        return nullptr;

    TCHAR szClass[MAX_CLASS_NAME];
    TCHAR szTitle[MAX_PATH];
    std::function< HWND(HWND hWndParent, LPCTSTR lpClassName, LPCTSTR lpWindowName)> _FindDescendantWindows;
    _FindDescendantWindows = [&](HWND hWndParent, LPCTSTR lpClassName, LPCTSTR lpWindowName)->HWND {

        HWND hChild = ::GetWindow(hWndParent, GW_CHILD);
        while (hChild != NULL)
        {
            UINT cmp = 0;
            ::GetClassName(hChild, szClass, MAX_CLASS_NAME);
            if (_tcsicmp(szClass, lpClassName) == 0)
                cmp++;
            if (cmp == nCompare)
                return hChild;

            ::GetWindowText(hChild, szTitle, MAX_PATH);
            if (_tcsicmp(szTitle, lpWindowName) == 0)
                cmp++;
            if (cmp == nCompare)
                return hChild;

            HWND hFind = _FindDescendantWindows(hChild, lpClassName, lpWindowName);
            if (hFind != nullptr)
                return hFind;

            hChild = ::GetWindow(hChild, GW_HWNDNEXT);
        }
        return nullptr;
    };
    return _FindDescendantWindows(hWndParent, lpClassName, lpWindowName);
}
时间: 2024-10-05 23:10:56

Lambda 表达式递归用法实例的相关文章

python lambda表达式简单用法【转】

python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>>3 当然,你也可以这样使用: lambda x:x+1(1) >>>2 可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为: 1 def g(x):2 return x+1 非常容易理解,在这里lambda简化了函数定义

C++11 lambda表达式基本用法

#include <iostream> using namespace std; void func1() { cout<<"lambda表达式,值捕获,类似值传递"<<endl; size_t v1=30;//size_t为unsigned int无符号整数 size_t v2=30; size_t v3=30; auto f=[v1,v2,v3]{return v1+v2+v3;};//lambda表达式中[]里面放的是要传递的参数,可以放多个.

python lambda表达式简单用法

转自:http://www.cnblogs.com/guigujun/p/6134828.html 习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1:     name = 'wupeiqi' else:     name = 'alex'   # 三元运算 name = 'wupeiqi' if 1 == 1 else 'alex' 对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

通过编译lambda表达式来创建实例(可在反射时候用,效率比反射高一些)

原文地址:https://rogerjohansson.blog/2008/02/28/linq-expressions-creating-objects/ 据说编译lambda创建实例是比反射快.实际测试了一下,循环创建10,000次花的时间差不多,创建1,000,000,反射大概十几秒,lambda不到1秒. 实际使用应该没什么影响,因为一般不会出现大量创建实例的场景.不过创建生成lambda的代码还是可以学习下的. class Program { static void Main(stri

boost在lambda表达式中调用占位符参数的成员函数的方法

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数. 我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost.但是我用的

Java8新特性之lambda表达式

lambda表达式 简化实例化函数式接口(functional interface)的过程 lambda表达式的优势 简化代码的实现 lambda表达式的语法 一个 Lambda 表达式可以有零个或多个参数 参数的类型既可以明确声明,也可以根据上下文来推断.例如:(int a)与(a)效果相同 所有参数需包含在圆括号内,参数之间用逗号相隔.例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c) 空圆括号代表参数集为空.例如:() -> 42

java lambda表达式学习笔记

lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射人先射马,擒贼先擒王.学习一个库要学习它的入口类.lambda的入口类是Stream,一看Stream中的函数就会发现Function,Predicate等lambda元素. 一.几个概念     函数式接口 Functional Interface,除了static和default类型的方法外,只有一个函数

C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该方法已过期的警告,如下图: 又如,在.Net Re

Java8新特性学习笔记(一) Lambda表达式

没有用Lambda表达式的写法:  Comparator<Transaction> byYear = new Comparator<Transaction>() {             @Override            public int compare(Transaction o1, Transaction o2) {                return o1.getValue().compareTo(o2.getValue());