Delegateを使って関数を呼び出すサンプルコード

VisualStudio2005->新規プロジェクト->CLRコンソールアプリケーションから。
関数を登録していって呼び出すまで。

ソースは続きを読むから:

//Delegateから関数を呼ぶサンプル

#include "stdafx.h"

using namespace System;

//Delegate関数を宣言
//「型の宣言」と同様。引数、戻り値がこのようである関数を登録出来る
delegate void DelegateFunction(int);

//func1,2は通常の関数
void func1(int n)
{
	Console::WriteLine(L"func1 start------------------------");
	Console::WriteLine(L"func1() : n = {0}", n);
}

void func2(int n)
{
	Console::WriteLine(L"func2 start------------------------");
	Console::WriteLine(L"func2() : n = {0}", n);
}

//クラス内関数、当然いずれもpublic
//Stat_funcAはスタティック関数、funcAは非スタティック関数
//スタティック関数=グローバル関数のようなもの、Class宣言の時点で存在する
ref class ClassA
{
public:
	static void Stat_funcA(int n)
	{
		Console::WriteLine("Stat_funcA start---------------------------");
		Console::WriteLine("Stat_funcA() : n = {0}", n);
	}
	void funcA(int n)
	{
		Console::WriteLine("funcA start---------------------------");
		Console::WriteLine("funcA() : n = {0}", n);
	}
};

//main関数
//上記関数をすべてDelegateして実行
int main(array<System::String ^> ^args)
{
	int n = 10;

	//Delegate宣言
	DelegateFunction ^oDelegateFunction = nullptr;

	//func1を登録
	oDelegateFunction = gcnew DelegateFunction(&func1);

	//続けて登録可能
	oDelegateFunction += gcnew DelegateFunction(&func2);

	//Classのスタティック関数なら普通に登録可能
	oDelegateFunction += gcnew DelegateFunction(&ClassA::Stat_funcA);

	//非スタティックだとClass宣言だけではまだ存在しない
	//一度オブジェクトとして宣言してから登録する必要がある
	//この場合、Delegate関数は関数の直接登録ではなく
	//オブジェクトを第一引数にする必要がある(オーバーロードなので引数増やせばいい)
	ClassA ^oClassA = gcnew ClassA();
	oDelegateFunction += gcnew DelegateFunction(oClassA, &ClassA::funcA);

	//実行後ループ
	oDelegateFunction(n);
	while(1);

	return 0;
}