std::bind (C++)
Introduced to me by Kajanan. We see this a lot in ROS2 codebase.
Resources
- https://cplusplus.com/reference/functional/bind/
- https://stackoverflow.com/questions/6610046/stdfunction-and-stdbind-what-are-they-and-when-should-they-be-used
#serendipity This is kind of like setting the capture clause in a Lambda Function.
In std::bind, the number of the arguments is , when is the number of arguments to the function . i.e.
std::bind(f, arg1, arg2, ..., argN);f: This is the function (or callable) you are binding.arg1, arg2, ..., argN: These are the arguments you are binding to the function. You can use actual values, or placeholders likestd::placeholders::_1,std::placeholders::_2, etc., which represent arguments to be provided when the new function is called.
#include <functional>
#include <iostream>
void add(int a, int b) {
std::cout << a + b << std::endl;
}
auto boundFunc = std::bind(add, 10, std::placeholders::_1);
boundFunc(5); // Output: 15std::bind With Member functions
When you use std::bind to bind a member functions, the first argument to std::bind is the object (this) on which the member function will be called. The placeholders (_1, _2, etc.) refer to the arguments that will be passed to the bound function when it is invoked.
Like this
class HelloWorldSubscriber : public rclcpp::Node {
public:
HelloWorldSubscriber() : Node{"minimal_subscriber"} {
auto subscription = this->create_subscription<std::string>(
"sub_topic", 10, std::bind(&HelloWorldSubscriber::string_callback, this, std::placeholders::_1));
}
private:
void string_callback(std::string& str) {
std::cout << "Received message: " << str << std::endl;
}
};