DoxygenでC++テンプレートとテンプレートメタ関数を文書化する方法に関するガイドラインはありますか?
例えば:
/// @brief metafunction for generation of a map of message types to
/// their associated callbacks.
/// @tparam Seq the list of message types
template< class Seq >
struct generate_callback_map
{
typedef typename mpl::transform< Seq
, build_type_signature_pair< mpl::_1 >
>::type vector_pair_type;
typedef typename fusion::result_of::as_map< vector_pair_type >::type type;
};
これまでのところ、次の提案を見てきました。
@tparam
テンプレートパラメータの文書化に使用されます。@arg
テンプレートパラメータを文書化する別の方法。@brief
メタ機能の説明に使用されます。メタファンクションの「返される型」はどのように文書化する必要がありますか?
DoxygenをC++テンプレートで使用するための良い提案や個人的な好みはありますか?
元々はオブジェクト指向のパラダイム用に設計されており、メタプログラミングではないので、doxygenでドキュメントの高度なテンプレート構造を使用することは不可能だと思います。例として、GNU STL(libstdc ++)はdoxygenを使用しますが、STLでメタプログラミングを文書化する 不十分なジョブ を行います。
一方、boostは独自のツールを使用します: QuickBook は、スタンドアロンテキストファイルとdoxygenのドキュメント化されたソースを使用して BoostBookを生成します マークアップ( DocBook の拡張)これにより、html/pdfが生成されます。 result はlibstdc ++よりも有益ですが、明らかにdevからのもう少しの作業が含まれます。
ブーストドキュメンテーションはメタプログラミングにとって間違いなく最高の1つであるため、特にdoxygenを補完するため、この方法を使用できます。既存のマークアップを再利用できます。
あなたの質問に正確に答えているわけではありませんが、最近のclang developments に興味があるかもしれません。 --with-extra-options=-Wdocumentation
を使用してclangを構築すると、コードでdoxygenマークアップを意味的にチェックし、ドキュメントの警告を生成します。ドキュメント/コードの同期を維持します。
つかいます @tparam
テンプレート引数の場合、@arg
関数の引数。戻り値の場合、@return
。ここには返品はありません。 typedef
sだけがあります。
ところで、サンプルコードはメタ関数のようには見えません。メタファンクションは、SFINAEを利用してC++が本来意図していないこと(リフレクションなど)を行う毛深い獣です。きみの generate_callback_map
は、テンプレートtypedefのC++ 03スタンドインのように見えます。
不足しているのは、typedefに関するドキュメントと、このテンプレートの使用方法に関するドキュメントです。
/// @brief metafunction for generation of a map of message types to
/// their associated callbacks.
/// @details
/// Usage: Use <tt>generate_callback_map<Type>::type</tt> to ...
/// @tparam Seq the list of message types
///
template< class Seq >
struct generate_callback_map
{
/// @brief It's a good idea to document all of your typedefs.
typedef typename mpl::transform< Seq
, build_type_signature_pair< mpl::_1 >
>::type vector_pair_type;
/// @brief This is why generate_callback_map exists. Document it!
typedef typename fusion::result_of::as_map< vector_pair_type >::type type;
};