【C++】コールバッククラスを作ってみた

コールバックを使ってみたかった。

あと、コールバック用のクラスも作ってみたかった。

という自分用のメモです。

今日のお話

環境

対象言語

プログラム

/**
 * @file task.cpp
 * @brief 
 * @details 
 * ■やってみたかったこと
 * ①外部から処理を設定する
 * ②処理の順番を決める
 * @date 2021-03-20
 */
#include <iostream>
#include <functional>
#include <stdio.h>
#include <time.h>

/**
 * @brief std
 * @details 
 */
using namespace std;

/**
 * @brief タスク
 * @details 
 */
class Task
{
private:
    function<void()> prepare = nullptr;
    function<int()> execute = nullptr;
    function<void()> postproc = nullptr;
    function<void(int)> success = nullptr;
    function<void()> error = nullptr;

public:
    /**
     * @brief 準備処理
     * @details 
     * @param _prepare 
     */
    void onPrepare(function<void()> _prepare)
    {
        prepare = _prepare;
    }

    /**
     * @brief 実行処理
     * @details 
     * @param _execute 
     */
    void onExecute(function<int()> _execute)
    {
        execute = _execute;
    }

    /**
     * @brief 事後処理
     * @details 
     * @param _postproc 
     */
    void onPostproc(function<void()> _postproc)
    {
        postproc = _postproc;
    }

    /**
     * @brief 成功時の処理
     * @details 
     * @param _postproc 
     */
    void onSuccess(function<void(int)> _success)
    {
        success = _success;
    }

    /**
     * @brief 失敗時の処理
     * @details 
     * @param _postproc 
     */
    void onError(function<void()> _error)
    {
        error = _error;
    }

    /**
      * @brief 実行関数
      * @details 設定されている処理を順に実行していく
      */
    void Exec()
    {
        // 事前処理
        prepare();

        // 実行処理
        try
        {
            // 実行
            int res = execute();
            // 成功
            success(res);
        }
        catch (exception &ex)
        {
            // 失敗
            error();
        }
        // 後処理
        postproc();
    }
};

/**
 * @brief 乱数 初期値
 * @details 乱数の初期値設定関数
 */
inline void InitRand()
{
    srand((unsigned int)time(NULL));
}

/**
 * @brief メイン関数
 * @details 
 * @return int 
 */
int main()
{
    // タスクインスタンス
    Task task = Task();

    // 準備処理
    task.onPrepare([]() {
        cout << "** prepare **" << endl;
        InitRand();
    });
    // 実行処理
    task.onExecute([]() {
        cout << "exec..." << endl;
        // 乱数の発生
        int res = rand();
        if (res % 2 == 0)
        {
            throw exception();
        }
        return res;
    });
    // 事後処理
    task.onPostproc([]() {
        cout << "** postproc **" << endl;
    });
    // 成功時
    task.onSuccess([](int res) {
        cout << "success : " + to_string(res) << endl;
    });
    // 失敗時
    task.onError([]() {
        cout << "error" << endl;
    });

    // 実行
    task.Exec();

    return 0;
}

気付き

  • function型というものがある。

  • 関数を外部から注入することができるので、見通しをよくできそう。

戯言

  • もう春ですね