2010-04-04 83 views
3

我想知道如何实现标题中陈述的内容。我试着像...std :: for_each在具有1个参数的成员函数上

std::for_each(a.begin(), a.end(), std::mem_fun_ref(&myClass::someFunc))

,但我得到一个错误说的“术语”(I“M假设这意味着第三个参数)不计算为一个函数参数1 ,即使someFunc没有采取一个参数 - 对象的类型存储在a

我想知道如果我想要做的是可能使用标准库(我知道我可以轻松地使用boost )

PS使用for_eachmem_fun_ref与只通过手动迭代a并将对象传递给someFunc相比,有任何性能影响?

回答

2

尽管someFunc是具有一个参数的成员,但mem_fun_ref使用隐含的“myClass”第一个参数。你想使用矢量的项目作为第二个参数。

而使用for_each和mem_fun_ref可能没有负面的性能影响。编译器将生成可比较的代码。但是,唯一可以确定的方法是基准:)

std::for_each(a.begin(), a.end(), 
       std::bind1st(
        std::mem_fun_ref(&MyClass::SomeFunc), 
        my_class)); 
+0

我假设我会使用bind2nd。现在我正在考虑如何指定在迭代中使用当前元素。我想我只会使用提升.. – Person 2010-04-04 02:58:41

+0

不,仍然使用bind1st。 mem_fun_ref变成一个带有两个参数的函数。第一个是MyClass,第二个是你的成员函数参数。您想要将第一个参数绑定到mem_fun_ref到您的类实例。 – Stephen 2010-04-04 03:50:12

+1

@Person:如果你要使用Boost,我建议使用他们的foreach宏。 'std :: for_each'只是一个失败的想法,并且通常会导致更多的扩展,更难以阅读代码。 – GManNickG 2010-04-04 03:52:14

1

我想你需要使用bind_1st来提供隐藏的“this”参数。或者你的意思是“这个”是唯一的参数,someFunc没有自己的参数?

+0

someFunc有一个参数。像myClass :: someFunc(someType)。 – Person 2010-04-04 02:27:21

相关问题