如何创建引用局部变量的函数指针?

时间:2015-10-12 23:30:04

标签: c++ lambda closures function-pointers

我尝试使用第一个列表的forEach方法将一个列表中的所有项目添加到另一个列表中,该方法接受一个函数指针并在每个元素上调用函数,但是我' m无法创建可以调用第二个列表的成员函数的函数指针。我尝试过使用lambdas:

LinearLinkedList<bar> test;
//<add items to test>
LinearLinkedList<bar> sorted;
auto addToSorted = [&](bar * b) { sorted.addSorted(b, &barLessThan); };
test.forEach(&addToSorted);

并使用内部struct

LinearLinkedList<bar> test;
//<add items to test>
LinearLinkedList<bar> sorted;
struct Sorter {
    static LinearLinkedList<bar> * list = &sorted;
    static void addToSorted(bar * b) { list->addSorted(b, &barLessThan); }
};
test.forEach(&Sorter::addToSorted);

但两者都被编译器拒绝,因为它们以非法方式引用sorted。如何在致电sorted时参考forEach

1 个答案:

答案 0 :(得分:0)

Lambdas只有在没有捕获任何东西时才会衰减到函数指针。请考虑以下代码段:

#include <iostream>

void run(int(*f)())
{
    std::cout << f();
}

struct S {
    static int something;
    static int nothing()
    {
        return something;
    }
};
int S::something = 0;

int main()
{
    auto simpleLambda = [](){ return 1; };
    run(simpleLambda);

    // auto capturingLambda = [&](){ return 1; };
    // run(capturingLambda);

    S::something = 2;
    run(S::nothing);
}

注释掉的部分将无法编译,因为capturingLambda具有非空捕获列表。您可以使用我在代码中添加的变通方法,或者更好地使您的forEach函数在仿函数类型上模板化,就像所有STL算法一样。