この記事は最終更新日から1年以上が経過しています。
@programming
投稿日 2021/1/26
更新日 2021/1/26 ✏
C++で関数ポインタとコールバック関数
C++でコールバックを実現する方法のメモです。
C++でコールバックを実現するためには「関数ポインタ」を使います。 更に「ラムダ式」を利用することで匿名関数をコールバック関数として渡すようなこともできるため、JSのコールバック関数っぽくコーディングすることもできます。
目次:
関数ポインタのサンプル
まずはシンプルに関数ポインタの使い方のサンプルです。
関数を直接実行するのではなく、関数のポインタを取得し、そこから実行します。
function-pointer.cpp
#include <iostream>
using namespace std;
void func() {
cout << "func called!" << endl;
};
int main() {
// 普通に関数を呼び出す方法:
func();// 関数を実行
// 関数ポインタから関数呼び出す方法:
typedef void (*FuncPtr)(); // 関数ポインタ型を定義
FuncPtr funcPtr = &func; // 関数ポインタを取得
funcPtr(); // 関数を実行
}
コンパイル&実行
## コンパイル:
$ g++ -o a.out function-pointer.cpp -std=c++11
## 実行:
$ ./a.out
func called! # <== 普通にfunc()を実行
func called! # <== 関数ポインタからfunc()を実行
コールバックのサンプル
次は関数ポインタとラムダ式を使ったコールバックのサンプルです。
function-pointer-callback.cpp
#include <iostream>
using namespace std;
// コールバック用の関数ポインタ型を定義
typedef void (*CallbackPtr)(string s);
/**
* コールバックを実行する関数
* @param s {string} - テキトーな文字列
* @param cb {CallbackPtr} - コールバック関数の関数ポインタ
*/
void func(string s, CallbackPtr cb) {
cout << "func calling callback..." << endl;
cb(s); // コールバック関数を実行
}
int main() {
// func関数の
// + 第一引数にテキトーな文字列
// + 第二引数にコールバック関数のラムダ式(匿名関数)
// を渡す:
func("hello", [](string s) {
cout << "callback called with string: " << s << endl;
});
}
コンパイル&実行
## コンパイル:
$ g++ -o a.out function-pointer-callback.cpp -std=c++11
## 実行:
$ ./a.out
func calling callback...
callback called with string: hello
以上です。