После указания аргумента placer в boost :: bind, почему он опускается при вызове?

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)? Почему аргумент опущен?

         #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;
         }
Теги:
boost

1 ответ

2
Лучший ответ

Нет, функция не пытается вызвать функцию registerCallback(f). Функция f передается параметру, который принимает функцию 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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню