Tag: lambda

最简单最新的c ++ 11 ScopeGuard

我试图写一个基于Alexandrescu概念的简单的ScopeGuard,但用c ++ 11的习惯用法。 namespace RAII { template< typename Lambda > class ScopeGuard { mutable bool committed; Lambda rollbackLambda; public: ScopeGuard( const Lambda& _l) : committed(false) , rollbackLambda(_l) {} template< typename AdquireLambda > ScopeGuard( const AdquireLambda& _al , const Lambda& _l) : committed(false) , rollbackLambda(_l) { _al(); } ~ScopeGuard() { if (!committed) rollbackLambda(); } inline void […]

使用lambdaexpression式获取属性名称和types

我正在尝试编写一个函数,使用如下所示的语法来提取属性的名称和types: private class SomeClass { Public string Col1; } PropertyMapper<Somewhere> propertyMapper = new PropertyMapper<Somewhere>(); propertyMapper.MapProperty(x => x.Col1) 有什么办法可以将这个属性传递给函数,而不会对这个语法做任何重大的修改? 我想获得属性名称和属性types。 所以在下面的例子中,我想要检索 Name = "Col1"和Type = "System.String" 谁能帮忙?

Java Lambda Stream Distinct()上的任意键?

我经常遇到一个Java lambdaexpression式的问题,当我想在一个对象的任意属性或方法上使用distinct()stream时,但是想保留该对象而不是将其映射到该属性或方法。 我开始创build这里讨论的容器,但是我已经开始做足够多的工作,变得烦人,并且做了很多样板类。 我把这个Pairing类放在一起,这个类包含两个types的两个对象,并允许你指定closures左边,右边或两个对象。 我的问题是…真的没有内置的lambdastream函数distinct()在某种关键供应商? 那真让我感到吃惊。 如果不是,这个class级能否可靠地履行这个职能? 这是如何被调用的 BigDecimal totalShare = orders.stream().map(c -> Pairing.keyLeft(c.getCompany().getId(), c.getShare())).distinct().map(Pairing::getRightItem).reduce(BigDecimal.ZERO, (x,y) -> x.add(y)); 这是配对类 public final class Pairing<X,Y> { private final X item1; private final Y item2; private final KeySetup keySetup; private static enum KeySetup {LEFT,RIGHT,BOTH}; private Pairing(X item1, Y item2, KeySetup keySetup) { this.item1 = item1; this.item2 = item2; […]

C#中的Lambdaexpression式是否closures?

lambdaexpression式(以及一定程度的匿名函数)是否被closures? 我对闭包的理解是,它们是被视为对象的函数,它似乎是匿名函数和Lambdaexpression式的精确表示。 把它们叫做闭包是正确的吗? 据我所知,由于口语方言,closures(或stream行),但它也是一个一般的编程术语? 感谢您的澄清,您可以提供!

为什么在C ++ 14中使用std :: bind over lambdas?

在C ++ 11之前,我使用了boost::bind或boost::lambda 。 bind部分成为标准库( std::bind ),另一部分成为核心语言(C ++ lambda)的一部分,并使lambda的使用更容易。 现在,我很less使用std::bind ,因为我几乎可以用C ++ lambda来做任何事情。 有一个有效的用于std::bind用例我可以想到: struct foo { typedef void result_type; template < typename A, typename B > void operator()(A a, B b) { cout << a << ' ' << b; } }; auto f = bind(foo(), _1, _2); f( "test", 1.2f ); // will […]

如何创buildexpression式树来表示C#中的String.Contains(“term”)?

我只是开始expression树,所以我希望这是有道理的。 我正在尝试创build一个expression式树来表示: t => t.SomeProperty.Contains("stringValue"); 到目前为止我已经得到: private static Expression.Lambda<Func<string, bool>> GetContainsExpression<T>(string propertyName, string propertyValue) { var parameterExp = Expression.Parameter(typeof(T), "type"); var propertyExp = Expression.Property(parameter, propertyName); var containsMethodExp = Expression.*SomeMemberReferenceFunction*("Contains", propertyExp) //this is where I got lost, obviously 🙂 … return Expression.Lambda<Func<string, bool>>(containsMethodExp, parameterExp); //then something like this } 我只是不知道如何引用String.Contains()方法。 帮助赞赏。

通过引用在C ++ 11 lambda中捕获参考

考虑这个: #include <functional> #include <iostream> std::function<void()> make_function(int& x) { return [&]{ std::cout << x << std::endl; }; } int main() { int i = 3; auto f = make_function(i); i = 5; f(); } 这个程序保证输出5而不会调用未定义的行为? 我知道它是如何工作的,如果我通过值捕获x ( [=] ),但我不确定是否通过引用捕获它来调用未定义的行为。 难道是在make_function返回之后,我最终会得到一个make_function引用,或者只要最初引用的对象仍然存在,被捕获的引用就能保证工作? 在这里寻找明确的基于标准的答案:) 到目前为止 ,它在实践中运作良好;)

LINQexpression式返回属性值?

我正在尝试创build一个通用函数来帮助我从本地列表中使用LINQ to SQL来select数千条logging。 SQL Server(2005年至less)限制查询2100参数,我想select更多的logging。 这将是一个很好的例子用法: var some_product_numbers = new int[] { 1,2,3 … 9999 }; Products.SelectByParameterList(some_product_numbers, p => p.ProductNumber); 这是我的(非工作)实现: public static IEnumerable<T> SelectByParameterList<T, PropertyType>(Table<T> items, IEnumerable<PropertyType> parameterList, Expression<Func<T, PropertyType>> property) where T : class { var groups = parameterList .Select((Parameter, index) => new { GroupID = index / 2000, //2000 parameters per request […]

如何定义一个在Java 8中将lambda作为参数的方法?

在Java 8中,方法可以创build为Lambdaexpression式,并且可以通过引用传递(在引擎下进行一些工作)。 在线创build和使用lambdaexpression式的例子很多,但没有例子说明如何创build一个以lambda为参数的方法。 这是什么语法? MyClass.method((a, b) -> a+b); class MyClass{ //How do I define this method? static int method(Lambda l){ return l(5, 10); } }

为什么lambda可以比普通函数更好地被编译器优化?

在他的书The C++ Standard Library (Second Edition) Nicolai Josuttis指出,编译器比普通函数可以更好地优化lambdaexpression式。 另外,C ++编译器比普通函数更好地优化lambdaexpression式。 (页213) 这是为什么? 我认为当谈到内联时,应该没有任何区别了。 我能想到的唯一原因是编译器可能有一个更好的lambdaexpression式的本地环境,这样可以做更多的假设和执行更多的优化。