как параметр?
Чтобы вызвать метод - член класса
а без передачи this, не получиться вызвать?
Если тебе нужен bind , то нет
А зачем может bind понадобиться если кроме this других параметров нет, только плейсхолдер дальше один ?
Не знаю. Во-первых, bind устарел, он с с++11 не нужен уже, есть лямбды. Во-вторых, ты покажи код, либо посмотри сам примеры на использование bind на CPR.
В целом - для вызова функции в контексте, где именно этот параметр ей не передадут
#include <ros/ros.h> #include <actionlib/server/simple_action_server.h> #include <actionlib_tutorials/FibonacciAction.h> class FibonacciAction { protected: ros::NodeHandle nh_; actionlib::SimpleActionServer<actionlib_tutorials::FibonacciAction> as_; // NodeHandle instance must be created before this line. Otherwise strange error occurs. std::string action_name_; // create messages that are used to published feedback/result actionlib_tutorials::FibonacciFeedback feedback_; actionlib_tutorials::FibonacciResult result_; public: FibonacciAction(std::string name) : as_(nh_, name, boost::bind(&FibonacciAction::executeCB, this, _1), false), action_name_(name) { as_.start(); } ~FibonacciAction(void) { } void executeCB(const actionlib_tutorials::FibonacciGoalConstPtr &goal) { // helper variables ros::Rate r(1); bool success = true; // push_back the seeds for the fibonacci sequence feedback_.sequence.clear(); feedback_.sequence.push_back(0); feedback_.sequence.push_back(1); // publish info to the console for the user ROS_INFO("%s: Executing, creating fibonacci sequence of order %i with seeds %i, %i", action_name_.c_str(), goal->order, feedback_.sequence[0], feedback_.sequence[1]); // start executing the action for(int i=1; i<=goal->order; i++) { // check that preempt has not been requested by the client if (as_.isPreemptRequested() || !ros::ok()) { ROS_INFO("%s: Preempted", action_name_.c_str()); // set the action state to preempted as_.setPreempted(); success = false; break; } feedback_.sequence.push_back(feedback_.sequence[i] + feedback_.sequence[i-1]); // publish the feedback as_.publishFeedback(feedback_); // this sleep is not necessary, the sequence is computed at 1 Hz for demonstration purposes r.sleep(); } if(success) { result_.sequence = feedback_.sequence; ROS_INFO("%s: Succeeded", action_name_.c_str()); // set the action state to succeeded as_.setSucceeded(result_); } } }; int main(int argc, char** argv) { ros::init(argc, argv, "fibonacci"); FibonacciAction fibonacci("fibonacci"); ros::spin(); return 0; }
Как устарел - не вижу разницы захватывающую лямбду использовать или bind, если например передавать куда-то в std::function том же. Но я стал использовать лямбды конечно для удобства чтения
Я так понимаю тут он используется потому что при вызвое bind в constructor initilizer list, не передасться дефолтно this?
Разница в удобстве
Я бы, по возможности использовал (std::)bind_front, он меньше перегружен ненужным функционалом по сравнению с std::bind и меньше загромождает код лишними скобочками по сравнению с лямбдами, имхо
Хм надо посмотреть что за хреновина такая. Он возвращает тоже служебный тип _Bind типа? На gcc конкретно
Судя по cppref, там unspecified, так что да, возвращать может что угодно. Делает то же самое, что и bind, только по порядку, без placeholders. По сути, это просто способ обеспечения частичного применения
Внутри "perfect forwarding"
ну бинд фронт еще в компилтайме неплохо раскручивается и выходит эффективнее
Обсуждают сегодня