标签: anonymous-function

可以通过boost获得C++匿名函数吗?

我正在尝试解决匿名函数变得更加容易的问题,并且想知道这是否可以在c ++中实现.

我想做的是(基本上)

template<typename T>
T DoSomething(T one, function<T(T)> dosomething)
{
    return one + dosomething(5);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}
Run Code Online (Sandbox Code Playgroud)

对于我必须做的事情,这个例子非常非常简单.在C#中我会做p => p*5.我知道这很容易用C++ 0x,但我不能用它.我觉得我应该能够使用boost :: lambda,或使用占位符的boost :: bind和boost :: function的组合,但我似乎无法让它工作.这可能是不可能的,这也很好,但如果不可能请回答.谢谢.

编辑:好吧,似乎int的简单情况工作正常,一个更复杂的结构怎么样?所以,试试吧

struct NumHolder
{
  int x;
}

template<typename T>
T DoSomething(T one, function<T(NumHolder)> dosomething)
{
    NumHolder temp;
    temp = 5
    return one + dosomething(temp);
}

void GetMyVal(...)
{
   DoSomething<int>(1, /*anonymous func here*/)
}
Run Code Online (Sandbox Code Playgroud)

这里我的C#表达式将与p => p.temp*5一致.这是否可以在C++中使用boost进行?

编辑2:好的,现在我只是好奇:D如何调用lambda表达式中的函数?所以,如果我们有

int ChangeVal(int mult)
{
    return mult*5;
}

struct NumHolder …
Run Code Online (Sandbox Code Playgroud)

c++ boost anonymous-function

6
推荐指数
1
解决办法
2303
查看次数

匿名函数作为Action Script中的事件处理程序 - 好还是坏?

我从JS世界来到AS3,我应该承认匿名函数是我的弱点.我倾向于到处使用它们.现在,来到AS3我已经听过很多地方的内容,AS和Flash在处理垃圾收集时非常糟糕,应该清空,处理和删除所有事件处理程序和对象,以避免奇怪和无法解释的内存泄漏崩溃.不确定这部分是什么,但我想从一开始就遵循最佳实践.

所以我的问题是 - 使用匿名函数作为事件处理程序的想法有多糟糕?考虑一下这样的代码:

addEventListener(Event.ENTER_FRAME, function() : void {
    controls.elapsed = stream.time;
});
Run Code Online (Sandbox Code Playgroud)

contorls.elapsed是setter,除了设置视频播放器的当前播放时间外,还更新整个UI,streamNetStream对象,它传输实际视频.

还有很多其他地方匿名功能可以使代码更清晰,更直观.检查以下代码以获得控制栏的简单淡入效果:

public function showControls() : void
    {
        var self:Controls = this;

        if (!visible) {
            visible = true;
            fadeTimer = new Timer(30, 10);
            fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
                self.alpha += 0.1;
            });
            fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
                self.alpha = 1;
            });
            fadeTimer.start();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我完全喜欢它的外观和适合代码,但我担心泄漏.虽然Event.ENTER_FRAME处理程序可能永远不会在这种形式中变得有害,但计时器监听器呢.我应该手动删除这些侦听器,还是一旦我设置fadeTimer = null就会自动删除它们?是否可以正确删除具有匿名功能的侦听器?

anonymous-function event-handling actionscript-3

6
推荐指数
2
解决办法
1万
查看次数

如何编写递归匿名函数?

在我继续努力学习scala的过程中,我正在通过Odersky的'示例Scala'和第一类函数的章节,关于匿名函数的部分避免了递归匿名函数的情况.我有一个似乎有效的解决方案.我很好奇是否有更好的答案.

从pdf:Code来展示更高阶的功能

def sum(f: Int => Int, a: Int, b: Int): Int =
  if (a > b) 0 else f(a) + sum(f, a + 1, b)

def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x-1)

def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquares(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int …
Run Code Online (Sandbox Code Playgroud)

recursion scala anonymous-function

6
推荐指数
1
解决办法
2271
查看次数

匿名函数在MATLAB中调用自己

作为一个实验(因为我正在从用户数据生成匿名函数),我运行了以下MATLAB代码:

h = @(x) x * x
    h = @(x) x * x
h(3)
    ans = 9
h = @(x) h(x) + 1
    h = @(x)h(x)+1
h(3)
    ans = 10
Run Code Online (Sandbox Code Playgroud)

基本上,我自己做了一个匿名函数调用.MATLAB没有采用递归方式,而是记住了旧的函数定义.但是,工作空间不会将其显示为变量之一,并且句柄似乎也不知道它.

只要我保留新功能,旧功能是否会存储在幕后?这种结构有"陷阱"吗?

matlab anonymous-function

6
推荐指数
1
解决办法
874
查看次数

"使用"与将参数传递给控制器​​功能之间的区别

我没有一个特定的问题,只是希望加深我对Silex正在发生的事情的理解以及一些新的PHP功能.这是基于Silex文档"使用"页面上的代码示例:

$blogPosts = array(
    1 => array(
        'date'      => '2011-03-29',
        'author'    => 'igorw',
        'title'     => 'Using Silex',
        'body'      => '...',    );

$app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

问题

  • 将the $app$idas作为参数传递给函数,并使用 -ing $blogPosts变量有什么区别?

  • 可能$blogPosts也已通过了作为参数的函数?

  • 另外,我更常见use ($app).使用 -ing $app和传递它是一个参数有什么区别?

php closures anonymous-function silex

6
推荐指数
1
解决办法
778
查看次数

Laravel 4 - Container类:共享函数和闭包逻辑

我对这里讨论的问题有一个后续问题: Laravel核心方法混淆

我与driechel(上面提到的问题的作者)的情况相同,目前已经习惯了Laravel 4 FW并检查了核心.虽然给出了一个精确的答案,但我仍然不了解逻辑和幕后发生的事情.所以我非常感谢进一步的解释.我知道这可能是重复的,但由于我无法发表评论,我会用一个新问题给它一个镜头.希望这样好.

从本文开始,我一直在从另一个角度看这个:http: //blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/

在检查调用时,File:get()我最终在Container类的share函数中结束,该函数使用此实际参数调用share(function() { return new Filesystem; }.

我无法弄清楚的是使用$container.特别是在关闭时的第二次出现:

$object = $closure($container);

你能再次澄清一下吗?为什么$container在此处作为参数传递以及实际包含在其中的内容?据我所知$closure,保持并执行function() { return new Filesystem; }没有输入参数.

我搞不清楚了.现在研究这个和PHP匿名函数/闭包连续两天仍然无法弄明白.我既不理解$closure($container)这里的语法也不理解逻辑.

php closures callback anonymous-function laravel-4

6
推荐指数
1
解决办法
1953
查看次数

自动调用匿名函数而不声明为变量

我想调用一个匿名函数而不为它声明一个变量.

我知道这是一个有效的例子:

$foo = function ($bar) use ($foo) {
    if (is_array($bar)) {
        foreach ($bar AS $current) {
             $foo($current);
        }
    }
    else {
        print($bar);
    }
};

$foo($input);

# Unset variable cause we won't need it anymore
# and we like to have a lot of free memory.
unset($foo);
Run Code Online (Sandbox Code Playgroud)

但是我想自动调用它并取消它:

call_user_func(function ($bar) {
    if (is_array($bar)) {
         foreach ($bar AS $current) {
             # This won't work
             # as our function doesn't have any name.
             call_user_func(__FUNCTION__, $current);
         }
    }
    else {
         print($bar);
    }
}, …
Run Code Online (Sandbox Code Playgroud)

php recursion anonymous-function php-5.5

6
推荐指数
1
解决办法
1502
查看次数

如何使用可变数量的输出参数编写匿名函数?

使用deal我们可以编写具有多个输出参数的匿名函数,例如

minmax = @(x)deal(min(x),max(x));
[u,v] = minmax([1,2,3,4]); % outputs u = 1, v = 4
Run Code Online (Sandbox Code Playgroud)

但是如果你想为优化函数提供一个具有渐变的函数,那么fminunc这不起作用.该函数fminunc有时会调用输入函数,有时会调用两个输出参数. (编辑:这不是真的,你只需要指定你是否真的想要使用渐变,使用例如optimset('SpecifyObjectiveGradient',true).然后在一次调用中它总是要求相同数量的参数.)

我们必须提供类似的东西

function [f,g] = myFun(x)
 f = x^2; % function
 g = 2*x; % gradient
Run Code Online (Sandbox Code Playgroud)

可以使用一个两个输出参数调用.

那么有没有办法在不使用function关键字的情况下进行同样的内联?

matlab anonymous-function variadic-functions function-handle output

6
推荐指数
2
解决办法
185
查看次数

用多态成员函数替换lambda函数

我在多态类中具有以下成员,Parent并且我正在寻找一种替换foo为某种虚拟成员的方法bar

void Parent::myFunc() {
    // lots of variables
    // complicated calculations

    while (/* loop condition */) {
        // more variables and calculations

        auto foo = [&](int n) {/* ... */};

        foo(42);
        // want to replace with virtual
        // bar(42);
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是foo捕获了所有内容,而且我不知道授予bar相同访问权限的正确方法。

  1. 将所有内容都传递给baras参数会导致参数列表很大,这似乎不是一个很好的解决方案
  2. 我也可以将的局部变量myFunc()转换成的成员Parent,但这会不必要地延长这些变量的寿命,尤其是对于循环变量。

c++ polymorphism lambda anonymous-function

6
推荐指数
1
解决办法
78
查看次数

Julia 匿名函数和性能

我正在移植这个 Python 代码...

with open(filename, 'r') as f:
    results = [np.array(line.strip().split(' ')[:-1], float)
               for line in filter(lambda l: l[0] != '#', f.readlines())]
Run Code Online (Sandbox Code Playgroud)

……给朱莉娅。我想出了:

results = [map(ss -> parse(Float64, ss), split(s, " ")[1:end-1])
        for s in filter(s -> s[1] !== '#', readlines(filename))];
Run Code Online (Sandbox Code Playgroud)

这种移植的主要原因是潜在的性能提升,所以我在 Jupyter notebook 中对两个片段进行了计时:

  • 使用%%timeit...
    • Python: 12.8 ms ± 44.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    • 朱莉娅:@benchmark返回(除其他外)mean time: 8.250 ms (2.62% GC)。到现在为止还挺好; 我确实得到了性能提升。
  • 但是,在使用时@time: …

python performance anonymous-function julia

6
推荐指数
2
解决办法
213
查看次数