芽萌丸プログラミング部 @programming
@programming
2021/1/26 9:48 更新✏

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

以上です。

関連

C++

芽萌丸プログラミング部 @programming
芽萌丸プログラミング部@programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。記事は主に @TanakaSoftwareLab が担当。
オススメ:Zattoyomiで時事ネタチェックの時間節約!