GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

関数テンプレートへのポインタの配列の定義・使用方法

 明日やる修正で必要なので、事前にサンプルコードでテスト。

関数テンプレートへのポインタ

 型名・関数ポインタの宣言は通常でOK。代入は関数名にテンプレート引数をつけてやれば良い。

 ↓例

size_t (*fPtr)( size_t ) = doTemplateTest<int>;

関数テンプレートへのポインタの配列

 正確に書くと「関数テンプレートの実体へのポインタの配列」になるんだろうか? まぁいいや。

 引数がsize_t一個、返り値がsize_tの関数ポインタの型はsize_t (*)(size_t)になるので、これを使って配列なり自前の範囲チェック配列なりを作ればOK。

 後は単なる配列なんで、添え字使って呼び出すだけ。

// 関数テンプレートのテスト用関数
// 処理自体には何の意味も無い
template <typename T> size_t doTemplateTest( const size_t i ) {

	return i + sizeof( T );

}// doTemplateTest(...)


// 以下、どっかの関数内のコード
//	size_t (*fPtr[ 4 ])( size_t );        // 配列バージョン
	MyArray<4,size_t (*)( size_t )> fPtr; // 範囲チェック配列バージョン

	fPtr[ 0 ] = doTemplateTest<char>;
	fPtr[ 1 ] = doTemplateTest<int>;
	fPtr[ 2 ] = doTemplateTest<int64>;
	fPtr[ 3 ] = doTemplateTest<void *>;

	for( int i = 0; i < 4; i++ ) printf( "result[%d]==%Iu\n", i, fPtr[ i ]( 3 ) );