c++ - 将 for_each 调用的函数放在类中的什么位置?

标签 c++ function-pointers

对于较新的 C++ 功能,您通常会提供一个函数作为参数,例如:

// File A.cpp    

void do_something(Foo* foo) { ... }

void A::process_foo(){
    for_each( foo_list.begin(), foo_list.end(), do_something );
}

但是当我使用类时,我应该把函数 do_something(...) 放在哪里?我不能使它成为私有(private)成员,因为在将参数传递给 for_each 时我会丢失 this

所以我倾向于在我的实现文件 A.cpp 中定义一个简单的函数 do_something(...),就像上面的代码中给出的那样。由于这仅通过 A 的实现可见,因此我不冒命名空间污染的风险。由于其他类中的类似函数也只会在它们的实现中可见,因此我也不冒与另一个类的类似函数发生名称冲突的风险。

这是正确的方法吗?

另一个想法是使用 Lambda。我对 Lambdas 不是很熟悉,所以我不知道我应该尽可能多地使用它们还是只有在绝对必要时才使用它们......

最佳答案

std::for_each 的第三个参数需要是函数或带有一个参数的函数对象,例如它可以用 for_each 的前两个参数定义的范围内的元素调用。然后你有以下选项(假设 foo_list 存储 Foo*):

使用正则函数

void do_someting(Foo*){...}
for_each(..., do_something);

你可以把函数放在任何合适的地方。如果这是供本地使用,匿名命名空间是最佳选择。但它可能是例如在单独的编译单元中定义。

使用静态方法

static void do_something(Foo*){...}
for_each(..., &Foo::do_something);

请注意,它不一定是 Foo 的静态方法。

使用 lambda

for_each(...,[](Foo* f){...});

使用 Foo 类的方法(甚至是私有(private)的)和 std::bind

void method(){...}
for_each(..., std::bind(&Foo::method, _1));

还有其他选项,但这些是最常见的。

关于c++ - 将 for_each 调用的函数放在类中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24907222/

相关文章:

c++ - 透明 TreeView 控件

c++ - C++ 中的结构中的字符串

php - C++ 提供 PHP 文件吗?

c++ - WebServices 的跨平台开源第三方库

c++ - 将成员函数分配给函数指针

c++ - 原始函数指针与 boost::bind 返回值

c++ - 在 C++11 中用模板替换函数指针

c++ - 在 Node.js 和 v8 中调用使用包装对象作为参数的函数

c++ - 指向可变模板静态函数的指针。如何?

c++ - 为什么编译器在将函数 static_cast(ing) 为 void* 时表现不同?