K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>>問: >>>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 型の配列のサイズ、すなわち引数の要素数が手に入るというカラクリ。 >テンプレートに引数配列の要素数まで推測させているのにビックリ。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!