我想知道是什么[=]?这是一个简短的例子
template <typename T>
std::function<T (T)> makeConverter(T factor, T offset) {
return [=] (T input) -> T { return (offset + input) * factor; };
}
auto milesToKm = makeConverter(1.60936, 0.0);
Run Code Online (Sandbox Code Playgroud)
如何使用代码[]而不是[=]?
std::function<T (T)>
Run Code Online (Sandbox Code Playgroud)
意味着一个函数原型,它(T)作为参数和返回类型T?
我正在处理C++中一些lambda的记忆,但我对它们的大小感到有些困惑.
这是我的测试代码:
#include <iostream>
#include <string>
int main()
{
auto f = [](){ return 17; };
std::cout << f() << std::endl;
std::cout << &f << std::endl;
std::cout << sizeof(f) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里运行它:http://fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598
ouptut是:
17
0x7d90ba8f626f
1
Run Code Online (Sandbox Code Playgroud)
这表明我的lambda的大小是1.
这怎么可能?
lambda至少应该是指向它的实现的指针吗?
我想了解一些关于如何正确思考C++ 11闭包以及std::function如何实现它们以及如何处理内存的信息.
虽然我不相信过早优化,但我确实习惯在编写新代码时仔细考虑我的选择对性能的影响.我还进行了大量的实时编程,例如微控制器和音频系统,其中要避免非确定性的存储器分配/解除分配暂停.
因此,我想更好地了解何时使用或不使用C++ lambdas.
我目前的理解是没有捕获闭包的lambda就像一个C回调.但是,当通过值或引用捕获环境时,将在堆栈上创建匿名对象.当必须从函数返回值闭包时,将其包装进去std::function.在这种情况下闭包内存会发生什么?它是从堆栈复制到堆?它是否在被释放时std::function被释放,即它是否被引用计数为std::shared_ptr?
我想在实时系统中我可以建立一个lambda函数链,将B作为一个连续参数传递给A,以便A->B创建一个处理管道.在这种情况下,A和B闭包将被分配一次.虽然我不确定这些是否会在堆栈或堆上分配.然而,一般来说,这在实时系统中使用似乎是安全的.另一方面,如果B构造一些它返回的lambda函数C,那么C的内存将被重复分配和释放,这对于实时使用是不可接受的.
在伪代码中,一个DSP循环,我认为这将是实时安全的.我想执行处理块A然后执行B,其中A调用它的参数.这两个函数都返回std::function对象,因此f它将是一个std::function对象,其环境存储在堆上:
auto f = A(B); // A returns a function which calls B
// Memory for the function returned by A is on the heap?
// Note that A and B may maintain a state
// via mutable value-closure!
for (t=0; t<1000; t++) {
y = f(t)
}
Run Code Online (Sandbox Code Playgroud)
我认为在实时代码中使用它可能很糟糕:
for (t=0; t<1000; t++) {
y = A(B)(t); …Run Code Online (Sandbox Code Playgroud) 编辑:
如何将Django字段的默认设置为每次创建新模型对象时评估的函数?
我想做类似下面的事情,除了在这段代码中,代码被评估一次并将默认设置为创建的每个模型对象的相同日期,而不是每次创建模型对象时评估代码:
from datetime import datetime, timedelta
class MyModel(models.Model):
# default to 1 day from now
my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))
Run Code Online (Sandbox Code Playgroud)
原版的:
我想为函数参数创建一个默认值,使其成为动态的,并在每次调用函数时调用和设置.我怎样才能做到这一点?例如,
from datetime import datetime
def mydate(date=datetime.now()):
print date
mydate()
mydate() # prints the same thing as the previous call; but I want it to be a newer value
Run Code Online (Sandbox Code Playgroud)
具体来说,我想在Django中这样做,例如,
from datetime import datetime, timedelta
class MyModel(models.Model):
# default to 1 day from now
my_date = models.DateTimeField(default=datetime.now() + timedelta(days=1))
Run Code Online (Sandbox Code Playgroud) 昨天我在StackOverflow上的一个回复中看到了一个代码片段,这引起了我的兴趣.它是这样的:
List<string> myList = new List<string> {"aBc", "HELLO", "GoodBye"};
myList.ForEach(d=>d.ToLower());
Run Code Online (Sandbox Code Playgroud)
我希望我可以使用它将myList中的所有项目转换为小写.但是,它不会发生...运行此命令后,myList中的大小不变.
所以我的问题是,是否有一种方法,使用LINQ和Lambda表达式轻松地迭代并以类似于此的方式修改列表的内容.
谢谢,马克斯
在下面的代码中,第一次调用foo是不明确的,因此无法编译.
第二个,+在lambda之前添加,解析为函数指针重载.
#include <functional>
void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }
int main ()
{
foo( [](){} ); // ambiguous
foo( +[](){} ); // not ambiguous (calls the function pointer overload)
}
Run Code Online (Sandbox Code Playgroud)
+这里的符号是什么?
科特林具有非常不错的迭代功能,如forEach或repeat,但我不能让break和continue运营商与他们(包括本地和非本地)的工作:
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Run Code Online (Sandbox Code Playgroud)
目标是模拟通常的循环,其功能语法尽可能接近.在某些旧版本的Kotlin中肯定是可能的,但我很难重现语法.
问题可能是标签的错误(M12),但我认为第一个例子应该可行.
在我看来,我已经阅读过关于特殊技巧/注释的某处,但我找不到关于这个主题的任何参考.可能如下所示:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读"JavaScript:The Good Parts",作者提到JavaScript是第一个推出的lambda语言.
JavaScript的函数是具有(主要)词法范围的第一类对象.JavaScript是第一个成为主流的lambda语言.在内心深处,JavaScript与Lisp和Scheme有更多共同点,而不是Java.这是C的服装中的Lisp.这使得JavaScript成为非常强大的语言.
我没有得到什么是lambda语言.这种语言有哪些属性,它与Java,C,C++和Php等语言有什么不同?
修改局部变量forEach会产生编译错误:
正常
int ordinal = 0;
for (Example s : list) {
s.setOrdinal(ordinal);
ordinal++;
}
Run Code Online (Sandbox Code Playgroud)
随着Lambda
int ordinal = 0;
list.forEach(s -> {
s.setOrdinal(ordinal);
ordinal++;
});
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
我见过很多关于如何克服这个问题的文章,都与CTP4有关,或者添加了我自己的扩展方法.
是否有一个"官方"EF4包含方式在内部使用lambda表达式(对于第一级关系以及第二级和更多级别)或者它最终是否包含在RTM中?
它有一个 - 我很乐意学习如何做到这一点,因为现在在我的代码中使用lambda表达式(使用#system.data.entity#system.data.linq)仍然给了我:
无法将lambda表达式转换为类型'string',因为它不是委托类型:
var customers = from c in
context.Customers.Include(c=>c.Phone)
Run Code Online (Sandbox Code Playgroud)