0

我一直在研究 boost::bind 和 boost::function。我可以通过举一个例子来最好地解释我的理解。鉴于这个示例代码片段:

 void print(int x, int y){
    cout << x << "\t" << y << endl;
 }

 int main(){
       boost::function<void (int)> f = boost::bind (&print, _1, 2);
   f(5);
 }

显示 5 2.. 根据我的理解,绑定函数会创建一个函数对象,该对象可以将其一些参数绑定到一些常量参数(程序员的偏好)。

但是,我真正无法理解的是下面发布的源代码的这段代码片段:

boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f =
                 boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);
interface->registerCallback (f);

参数放置器是_1。不应该是 f(arg) 吗?为什么省略arg?

         #include <pcl/io/openni_grabber.h>
         #include <pcl/visualization/cloud_viewer.h>

         class SimpleOpenNIViewer
         {
           public:
             SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}

             void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
             {
               if (!viewer.wasStopped())
                 viewer.showCloud (cloud);
             }

             void run ()
             {
               pcl::Grabber* interface = new pcl::OpenNIGrabber();

               boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f =
                 boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);

               interface->registerCallback (f);

               interface->start ();

               while (!viewer.wasStopped())
               {
                 boost::this_thread::sleep (boost::posix_time::seconds (1));
               }

               interface->stop ();
             }

             pcl::visualization::CloudViewer viewer;
         };

         int main ()
         {
           SimpleOpenNIViewer v;
           v.run ();
           return 0;
         }
4

1 回答 1

2

不,该函数未尝试在 上调用registerCallback(f)。该函数f被传递给接受 a 的参数boost::function。参数最终将f在稍后调用时给出。例如:

typedef boost::function<void (int)> Function;

void h( Function f )
{
    f(5);
}

int main()
{
    auto cube = [] (int n) { std::cout << n * n * n; };

    h(cube); // cube is passed to the function, not called
}
于 2013-10-15T17:50:35.143 回答