#include <iostream>
#include <vector>
#include <string>
#include <ostream>
#include <algorithm>
#include <boost/function.hpp>
using namespace std;
class some_class
{
public:
void do_stuff(int i) const
{
cout << "some_class i: " << i << endl;
}
};
class other_class
{
public:
void operator()(int i) const
{
cout << "other_class i: " << i << endl;
}
};
int main() {
// CASE ONE
boost::function<void (some_class, int) > f;
// initilize f with a member function of some_class
f = &some_class::do_stuff;
// pass an instance of some_class in order to access class member
f(some_class(), 5);
// CASE TWO
boost::function<void (int) > f2;
// initialize f2 with a function object of other_class
f2 = other_class();
// Note: directly call the operator member function without
// providing an instance of other_class
f2(10);
}
// output
~/Documents/C++/boost $ ./p327
some_class i: 5
other_class i: 10
问题&GT;当我们通过boost :: function调用一个函数对象时,为什么我们不必为该类提供一个实例来调用这个类成员函数?
是不是因为我们通过以下方式提供了这些信息?
f2 = other_class();
答案 0 :(得分:7)
您必须为班级提供一个实例,而您正在提供一个实例。
boost::function<void (int) > f2;
f2 = other_class();
这会构造一个other_class
对象,并将该对象分配给f2
。 boost::function
然后复制该对象,以便在您尝试调用它时,不需要再次实例化它。
答案 1 :(得分:1)
为什么我们不必为类调用此类成员函数提供实例?
因为你已经给了它一个。就在这里:
f2 = other_class();
您创建了other_class
个实例,f2
复制。 f2
不存储other_class::operator()
函数;它存储类实例本身。所以当你这样做时:
f2(10);
f2
已存储在其中的实例。它相当于:
other_class()(10);