C++/クラス関数のチェーン

懐かしさ90%

懐かしさ90%

  • タグ:
  • タグはありません
/*
	基幹システム・関数ポインタによる処理実行クラス
*/
#pragma once
#include <windows.h>
//規定!
//Exe関数は引数なしのint関数で無ければならない(intはエラーコードを還すのね)。

//ジョブ
struct LBLFunc {
	typedef		int (*PF)(void);	//命令への関数ポインタ
	PF			pfunc;				//
	LBLFunc*	next;				//次の命令
	virtual	int	Do(){ return pfunc(); };	//関数実行

	LBLFunc::LBLFunc(){
		pfunc = NULL;
		next = NULL;
	};
};

template<typename T> struct LBLMFunc : LBLFunc {

	typedef		int (T::*PMF)(void);	//命令への関数ポインタの定義
	PMF			pmfunc;		//関数ポインタ
	T*			Class;		//クラスのポインタ	
	LBLFunc*	next;		//次の命令へ

	int	Do(){ return (Class->*pmfunc)(); };	//関数実行

	LBLMFunc(T* c, PMF pmf)	: LBLFunc()
	{
		Class = c;
		pmfunc = pmf;
		next = NULL;
	};
};



/*
	登録クラス
*/
class LBLFuncRegister {

	LBLFunc*	fstFunc;	//最初の命令
	LBLFunc*	lstFunc;	//最後の命令
	long m_Stacks;		//命令数

public:
	
	LBLFuncRegister(int (*pfunc)(void));
	~LBLFuncRegister();

	enum{
		MAX_FUNC = 1024	//最大命令数は1024
	};

    LPCVOID	AddRegist(int (*pfunc)(void));		//命令の登録(関数は名前があればポインタを解決できる)
	
	//命令の登録(メンバ関数は名前はオブジェクトと関数ポインタの両方を渡して登録)
	template<typename T>
	LPCVOID	AddRegist(int (T::*pmfunc)(), T* c)
	{
		LBLFunc* pLBLfunc = new LBLMFunc<T>(c,pmfunc);

		pLBLfunc->next = NULL;		//次は無い
		lstFunc->next = pLBLfunc;	//最後の命令の次はこれ。
		lstFunc = pLBLfunc;			//最後の命令を更新。

		return pLBLfunc;
	};

	void	DelAll();							//全ての命令の削除
	bool	DelRegist(LPCVOID pfuncAddress);	//命令の削除(登録時のアドレスからピンポイントで消す)
    void	DelRegist(int (*pdelfunc)(void));	//命令の削除(関数すべてを排除)

	void	ChkError(int error_code);		//エラーコードからエラーの内容を還す
	void	exe();	//全ての命令を実行
};