こんにちは、高木です。
前回は関数宣言をPHPで自動生成しました。以前にも関数宣言の自動生成をやりましたが、前回はそれをさらに進歩させてC++にも対応しました。今回は関数宣言に生成したのと同じ配列を使って、関数ヘッダーのコメントを自動生成したいと思います。
関数ヘッダーのコメントを生成するためには、前回の情報を多少は拡張する必要があります。前回の構造体だけでは、その関数がどんな機能を持つかの説明は前回のデータだけでは不十分です。そこで、今回は構造体を次のように拡張することにします。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php $all_of_info = [   'name' => 'all_off',   'specifier' => 'constexpr',   'template' => [     'InputIterator' => [ 'class', '反復子の型' ],     'Predicate' => [ 'class', '述語の型' ],   ],   'type' => [     [       'first' => [ 'InputIterator', '先頭要素を指す反復子' ],       'last' => [ 'InputIterator', '末尾要素の次を指す反復子' ],       'pred' => [ 'Predicate', '述語' ],     ],     [ 'bool', '条件を満たす場合はtrue、それ以外はfalse' ],   ],   'doc' => [     'brief' => '範囲の全要素が条件を満たすかの判定',     'detail' => '範囲[first, last]が空、または全反復子iに対してpred(*i)がtrueのときtrueを、それ以外はfalseを返す。',   ], ]; ?> | 
配列の最後のキー’doc’が今回拡張した部分です。今回はこの構造体を使って、Doxygenに対応したコメントを生成させます。
さっそくコメントを生成するコードを見ていきましょう。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <?php function make_doxygen_function_comment(array $info): string {   $type = $info['type'];   // ドキュメント情報   if (array_key_exists('doc', $info))     $doc = $info['doc'];   else     $doc = [];   $comment = '/**' . PHP_EOL;   // 概要   if (array_key_exists('brief', $doc))     $comment .= " * @brief {$doc['brief']}" . PHP_EOL;   // テンプレート   if (array_key_exists('template', $info))   {     foreach ($info['template'] as $key => $value)       $comment .= " * @tparam  $key  {$value[1]}" . PHP_EOL;   }   // 仮引数   foreach ($type[0] as $key => $value)     $comment .= " * @param $key  {$value[1]}" . PHP_EOL;   // 返却値型の生成   if (count($type) > 1)     $comment .= " * @return  {$type[1][1]}" . PHP_EOL;   if (array_key_exists('detail', $doc))     $comment .= " * {$doc['detail']}" . PHP_EOL;   $comment .= ' */' . PHP_EOL;   return $comment; } ?> | 
make_doxygen_function_comment関数というちょっと長い名前ですが、必要な情報を詰め込むとこんな感じになってしまいます。今回も前回と同様、見通しをよくするためにエラーチェックは行っていません。あらかじめご了承ください。
コメントの形式は /**~*/ を使っていますが、/// を1行ごとに並べてもいいでしょう。その場合はmake_doxygen_function_comment関数を修正する必要がありますが、そうした変更も簡単にできるはずです。
前回と今回作った関数を使って、次のように並べてあげればDoxygenのコメント付きの関数宣言を生成できます。
| 0 1 2 3 | <?= make_doxygen_function_comment($all_of_info);?> <?= make_function_declaration($all_of_info);?>; | 
せっかくなので生成結果も掲載しておきますね。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 | /**  * @brief 範囲の全要素が条件を満たすかの判定  * @tparam  InputIterator  反復子の型  * @tparam  Predicate  述語の型  * @param first  先頭要素を指す反復子  * @param last  末尾要素の次を指す反復子  * @param pred  述語  * @return  条件を満たす場合はtrue、それ以外はfalse  * 範囲[first, last]が空、または全反復子iに対してpred(*i)がtrueのときtrueを、それ以外はfalseを返す。  */ template <class InputIterator, class Predicate> constexpr bool all_off(InputIterator first, InputIterator last, Predicate pred); | 
こんな感じで、PHPを使った前処理でかなりたくさんのことができます。






![[C99] 第11回 その他、細部のちがい](https://www.kijineko.co.jp/wp-content/uploads/2021/09/22256716_s.jpg)