2012-11-13 42 views
42

C++テンプレートとテンプレートメタ関数をDoxygenで文書化する方法に関するガイドラインはありますか?例えばdoxygenを使ってC++テンプレートとテンプレートメタ関数を文書化するには?

:テンプレートパラメータを文書化するために使用さ

  • @tparam

    /// @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; 
    }; 
    

    これまでのところ、私は次の提案を見てきました。

  • @argテンプレートパラメータを文書化する別の方法です。
  • @briefを使用してメタ機能を記述します。メタ関数のための「が返さタイプは」文書化する必要がありますどのよう

誰もがC++テンプレートを使用してDoxygenのを使用するための任意の良い提案や個人的な好みを持っていますか?

+4

@Pubby:これは本当に便利なアドバイスです。あなたは何を使っていますか? –

+0

@JanHudecそれを生成するのではなく自分で書きます。スタイルガイドと一貫した書式設定を使用してください。読み取り可能なコードは、漏洩した抽象であるため、TMPにとって大きなプラスです。 psuedocodeを使って説明すると、C++の構文がうまくいくので助けになります。 – Pubby

+4

@Pubbyは冗談でなければなりません。良いドキュメントは、コードを見ないときです。あなたはヘッダ内の説明コメントを読んでいますが、コードスタイル、書式、読みやすさなどは気にしません。これは良いドキュメントです。 * Doxygen *はソースコード*(理想的にはヘッダー)からこれらの文書を抽出するための単なるツールです*。もちろん、HTMLの代わりに«targzipped»ヘッダーのようなAPIの説明を配布したい場合は/ pdf /何でも、幸い、幸運; * Doxygen *を使うのが好きです。 –

答えて

18

私はそれはそれは、もともとオブジェクト指向のパラダイムのために設計されており、metaprogramingれていなかったので、文書の高度なテンプレートは、doxygenを有する構築物の可能な使用ではないと思います。例として、GNU STL(libstdC++)はdoxygenを使用しますが、STLでメタプログラミングを文書化するのはpoor jobです。一方

、ブーストは、独自のツールを使用しています:QuickBookはターンでHTML/PDFを生成BoostBookマークアップ(DocBookの拡張子)を生成するために、スタンドアロンのテキストファイルとdoxygenの文書化されたソースを使用しています。 resultはlibstdC++よりも有益ですが、明らかに開発者からもう少し作業が必要です。ブーストドキュメント以来

は間違いなくあなたはそれがdoxygenのを補完し、特に以来、そのルートを行くことができるmetaprogramingのための最高の一つである - あなたは、既存のマークアップを再利用することができます。

それは正確にあなたの質問に答えていませんが、最近の打ち鳴らすdevelopmentsに興味があるかもしれません。 --with-extra-options=-Wdocumentationでclangをビルドすると、意味的にあなたのコードとあなたのdoxygenマークアップがチェックされ、ドキュメントの警告が生成されます。ドキュメント/コードの同期を保つようにします。

+1

私は同意します、ブーストの文書の大半は非常に良いです、そして、彼らのアプローチに従うことは確かに理にかなっています。 – mark

+1

ここには非常に良い情報があります。 Clang/LLVMのドキュメントチェックへのリンクは非常に便利です!私は '-Wdocumentation'だけを使用してそれを動作させる必要がありました。しかし、厳密にOPの質問に答えるわけではありません。 –

+1

Re "例として、GNU STL(libstdC++)はdoxygenを使用していますが、STLのメタプログラミングを文書化するのは難しいです。 GNUは文書化の貧弱な仕事をしています。ソースコードを見てください。存在する小さな解説は、せいぜい貧しいだけです。 doxygenの失敗の例として、GNUのひどい解説を使用することは公正ではありません。より良い例は、それにもかかわらず、doxygenで悪く見えるいくつかのよくコメントされたソースです。 –

33

は、関数の引数のための@arg@tparamテンプレート引数を使用します。戻り値は@returnです。ここには帰りはありません。ちょうどtypedefsがあります。

ところで、サンプルコードはメタ機能のようには見えません。メタ機能は、C++がもともと意図していなかったこと(例えば反射)を行うためにSFINAEを利用する毛深い獣です。 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; 
}; 
+4

C++では、「メタ機能」は通常、OPなどのコードを指します。はい、typedefですが、typedefには指定されたコンパイル時の "関数"を評価した結果の型が含まれています。 – jalf

+6

私はここに帰ってこないと争うだろう。形式的にクラスには戻り値はありませんが、論理的には 'type'型のtypedefが戻り値です。そして、別のメンバーとしてではなく、クラスのメイン文書本体でよりよく文書化されるでしょう。 –

+1

ここではリターンがあると主張できます。同じ意味で、この構造体定義は関数です。しかし、Doxygenと関連/互換性のあるdocジェネレータの観点から、この例では '@ return'でタグ付けしようとすると、それを混乱させるだけです。 @ davidのtypedefドキュメントの例はこの関数を扱うものであり、あいまいではありませんが、構造体そのものに関する簡単な文書で補うことができます。 –

関連する問題