对集合调用成员方法
Call a member method over a collection
我想知道在 C++11 中是否有可能出现这样的事情。这里的想法是让一个类保留对集合的引用,并提供一个通用方法来对其执行一些操作。使用以下代码,我在使用 bind 调用集合中每个项目的类的方法时遇到问题:
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
class Foo {
public:
void print() {
cout << "hello" << endl;
}
};
class Helper {
private:
vector<Foo> v;
public:
Helper() :
v(5) {
}
void perform(std::function<void(Foo&)>&& f) {
for_each(v.begin(), v.end(), f);
}
};
int main() {
Helper r;
r.perform(bind(&Foo::print)); //it doesn't work
r.perform([](Foo& f) {f.print();}); //it works
}
我想bind
想要一个真实的Foo实例。我想知道是否可以使用绑定而不是 lambda。我问只是因为我想了解C++11是如何工作的。需要bind
mem_fn
吗?
不,在您的情况下无法使用std::bind
。就像你说的,std::bind
期待一个Foo
的实例.顾名思义,它用于将对象绑定到不会更改的函数,这样您就不必每次都传递该对象。
void foo(int, bool) {}
int A = 10;
foo(A, false);
foo(A, true);
// now instead, I can "bind" A to foo.
auto foo2 = std::bind(&foo, A, std::placeholders::_1);
foo2(false);
foo2(true);
但别担心,你可以直接通过&Foo::print
。为什么?因为perform
接受第一个参数为Foo&
的函数,这正是print
采用的(它没有任何显式参数,但有一个隐式Foo&
参数)。
r.perform(&Foo::print);
有很多方法可以做到这一点。但首先,您需要了解您的问题是什么:
void perform(std::function<void(Foo&)>&& f) {
该参数是一个可调用的对象,它以Foo &
作为其参数,并返回一个void
。这就是它所宣布的。
r.perform(bind(&Foo::print));
std::bind
的目的是包装一个可调用对象并为其中一些参数提供默认值,同时从调用上下文转发其余参数。
此处没有要绑定到任何内容的默认参数。在可调用对象的上下文中,类方法(例如Foo::print
)将指向其对象的指针作为其第一个参数,在这种情况下,该参数将Foo *
,即要调用的实际对象,并且此处没有要绑定到任何内容的默认对象。这里没有什么std::bind
做的。它不可能在这里服务于任何逻辑目的。
第二个问题是:
for_each(v.begin(), v.end(), f);
for_each
传递对集合中对象的引用,传递给为其第三个参数指定的可调用对象。在这里,不知何故,你想在这里得到一个类方法,但类方法需要一个指向对象的指针。
撇开如何使一切融合在一起的问题不谈,没有直接的方法可以调和两者。一个"事物"想要指针,另一个想要引用。你必须改变一些东西。
更改此for_each
相当简单:
void perform(const std::function<void(Foo *)> &f) {
for_each(v.begin(), v.end(), [&](auto &g){ f(&g); });
}
现在,perform
采用一个可调用的对象,该对象将指针作为其第一个参数,并使用内部 lambda 执行必要的转换。
怎么称呼这个?你不需要std::bind
:
r.perform(&Foo::print);
就是这样。std::function
的构造函数将负责包装所有内容。
另一种方法是接收指向Foo
方法的指针,并调用它迭代v
向量中的Foo
元素。
我的意思是。。。类似的东西
void performMethod (void(Foo::*f)())
{
for ( auto & obj : v )
(obj.*f)();
}
可以称为
r.performMethod(&Foo::print);
- C++:在派生类成员上调用基类方法
- 从类C++外部调用指向成员方法的成员指针
- 在调用基类之前需要在成员上调用方法
- 简化静态成员函数调用的方法
- 如何检查是否调用了成员方法
- 对集合调用成员方法
- 从成员对象调用方法
- 我无法在班级中获得MED股票来调用成员方法
- 调用成员方法时会丢失此指针
- 动态调用成员方法c++
- 从另一个方法调用成员方法指针
- 以下4种样式调用其他成员方法有什么区别?
- 在C++中为成员对象调用受保护的方法
- 如何使用虚拟表正确调用成员方法
- 从另一个方法调用非静态成员方法
- 是否有可能在C++中的静态成员方法内部调用非静态成员方法
- 从 const 方法调用成员上的非常量方法
- 如何调用pass模板成员方法作为参数
- 函数的部分模板专用化,该函子调用传递给它的对象的成员方法
- 导致初始化的类成员变量在方法调用中变为(或看起来)未初始化的原因