[783] Re:ポインタ完全制覇
投稿者:CES
2007/02/20 02:13:25
>>問:
>>char 型の配列へのポインタを返す関数の宣言を記述しなさい。
>>関数名、引数、戻り値の要素数は任意とする。
>
>用途としては、「\0込みで30文字以内の文字列を可変の個数返す関数」とかですかね。
ポインタの読み方から頑張って導こうとしなくても、こんなのを書いちゃうと一発だと、散々悩んでから気がついた。
template< typename ReturnType >
ReturnType Test();
std::cout << typeid( Test< char(*)[10] > ) << std::endl;
ちなみに、皆さんご存知だと思うけれど、正解はこう(N は要素数)。
char ( * f() )[ N ];
なんでこんなもので悩んでいたかというと、VC++ に奇怪なソースを発見したから。
配列の要素数を数えるコード。
template< typename _TypeOfArray, size_t _SizeOfArray >
char ( * __countof_helper( _TypeOfArray ( & )[ _SizeOfArray ] ) )[ _SizeOfArray ];
#define _countof( _Array ) sizeof( * __countof_helper( _Array ) )
__countof_helper は、日本語で言うと「_TypeOfArray 型の配列(要素数は _SizeOfArray 個)の参照を引数に取り、char 型の配列(要素数は _SizeOfArray 個)のポインタを返す関数」の宣言。
返ってきたポインタを間接参照して sizeof すれば、引数に渡した配列と同じ要素数の char 型の配列のサイズ、すなわち引数の要素数が手に入るというカラクリ。
テンプレートに引数配列の要素数まで推測させているのにビックリ。