我尝试使用第一个列表的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
?
答案 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算法一样。