---
# System prepended metadata

title: 'C++雜談(一) - std::bind 包裝函式'

---

C++雜談(一) - std::bind 包裝函式
===

會看到std::bind，主要是之前在學習ROS2的時候，看到了一段範例程式碼:

```Clike=
timer_ = this->create_wall_timer(500ms, std::bind(&MinimalPublisher::timer_callback, this));
```

這段程式碼的意思是每500ms執行名為timer_callback的function

如果對於ROS2或是這段完整程式碼有興趣的

[傳送門 - ROS2 (一) - 建立第一個專案](https://hackmd.io/AiYYiXN9QMGXvz68JouiwA)

---

好了，接下來我們直接來看，本章的主要探討的程式碼:

```Clike
std::bind(&MinimalPublisher::timer_callback, this)
```

以下定義引用 [cppreference](https://en.cppreference.com/w/cpp/utility/functional/bind)

```Clike=
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
(since C++11)
(until C++20)
template< class F, class... Args >
constexpr /*unspecified*/ bind( F&& f, Args&&... args );
	(since C++20)
	(2) 	
template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
	(since C++11)
(until C++20)
template< class R, class F, class... Args >
constexpr /*unspecified*/ bind( F&& f, Args&&... args );
	(since C++20)
```

好了，我相信看了定義之後，應該還是很多人看不懂。沒關係，如果大家看定義就懂了，我就直接收筆了，哈哈。

---

為了瞭解std::bind，我找到了這篇 [文章](https://www.jyt0532.com/2017/01/08/bind/)

其中這個範例:

```Clike=
int add(int x, int y){
    return x + y;    
}
auto add12 = bind(add, 1, 2);
cout << add12() << endl; // print 3
```

完整程式碼:

```Clike=
#include <iostream>
// include bind function
#include <functional>
using namespace std;

// add function
int add(int x, int y){
    return x + y;    
}

int main()
{  
    auto add12 = bind(add, 1, 2);
    cout << add12() << endl;
    return 0;
}

```

所以，bind函式的用法簡單來說就是:

```Clike=
std::bind(函式位址 ,函式參數1, 函式參數2, ...);
```

也可以將一個函式，包裝成新的函式:
```Clike=
std::bind(函式位址 ,placeholders::_1, placeholders::_2, ..., placeholders::_N);
```
placeholders::_N表示佔位符。[參考](https://en.cppreference.com/w/cpp/utility/functional/placeholders)

舉個例子:

```Clike=
#include <iostream>
// include bind function
#include <functional>
using namespace std;

// add function
int add(int x, int y, int z){
    return x*100 + y*10 + z ;    
}

int main()
{  
    auto add12 = bind(add, std::placeholders::_1, std::placeholders::_2, 3);
    cout << add12(1,2) << endl; // print 123
    return 0;
}

```

上述例子中:
x => std::placeholders::_1
y => std::placeholders::_2
z => 3

而add12(1,2):
x => 1
y => 2
z => 3

---

如果把std::placeholders::_N 順序亂放的話會變成:

```Clike
#include <iostream>
// include bind function
#include <functional>
using namespace std;

// add function
int add(int x, int y, int z){
    return x*100 + y*10 + z ;    
}

int main()
{  
    auto add12 = bind(add, std::placeholders::_2, std::placeholders::_1, 3);
    cout << add12(1,2) << endl; //  print 213
    return 0;
}

```

這時:

x => std::placeholders::_2
y => std::placeholders::_1
z => 3

而add12(1,2):
x => 2
y => 1
z => 3

變成了一個新的函式

---

本篇就介紹到這裡，謝謝收看~~