2012-11-13 68 views
42

關於如何使用Doxygen記錄C++模板和模板元函數有任何指導原則嗎?如何用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 + +模板?

+4

@Pubby:這是一個非常有用的建議。你會用什麼,比? –

+0

@JanHudec自己寫,而不是生成它。當然使用風格指南和一致的格式。對於TMP,可讀代碼是一個巨大的優勢,因爲它們是一個漏洞抽象。使用psuedocode解釋有助於C++語法。 – Pubby

+4

@Pubby一定是在開玩笑吧。好的文檔是當你從不看代碼的時候。您可以在標題中閱讀解釋註釋,而且您甚至不關心實現中的情況,也就是說,您不關心代碼樣式,格式設置,可讀性等等 - 這是一個很好的文檔。 * Doxygen *僅僅是一個從源代碼*(理想情況下來自頭文件)*中提取這些文檔的工具。當然,如果你想分發你的API描述像一堆«targzipped»頭文件而不是html/pdf /什麼的,那麼祝你好運;我寧願使用* Doxygen *。 –

回答

18

我不認爲這是可能使用的文檔模板,先進與doxygen的構造,因爲它最初被設計爲面向對象的範例,而不是metaprograming。作爲例子,GNU STL(libstdC++)使用doxygen,但在STL中記錄了元編程的poor job

在另一方面,增強使用自己的工具:QuickBook使用獨立的文本文件和記錄doxygen的發生源BoostBook標記(的DocBook擴展),其輪流生成HTML/PDF文件。 result比libstdC++更具信息性,但顯然涉及開發人員更多的工作。

由於boost文檔可以說是元編程的最佳選擇之一,所以您可以走這條路線,特別是因爲它補充了doxygen - 您可以重複使用現有的標記。

雖然它不完全回答你的問題,但你可能會對最近的叮噹developments感興趣。當用--with-extra-options=-Wdocumentation構建鐺聲時,它會用您的代碼語義檢查您的doxygen標記並生成文檔警告。強制您保持文檔/代碼同步。

+1

我同意,大多數boost文檔非常好,並且遵循他們的方法當然有意義。 – mark

+1

這裏有很好的信息。鏈接到Clang/LLVM文檔檢查非常有用!我不得不使用'-Wdocumentation'來使它工作。儘管如此,並不嚴格回答OP的問題。 –

+1

Re「作爲一個例子,GNU STL(libstdC++)使用了doxygen,但是在STL中記錄元編程的功能很差。」 GNU在記錄期間做得很差。看看源代碼。存在的小評論至多很差。使用GNU糟糕的評論作爲doxygen失敗的例子是不公平的。一個更好的例子是一些備受好評的消息來源,儘管如此,它在doxygen中看起來很糟糕。 –

33

使用@tparam模板參數,@arg函數參數。對於返回值,@return。這裏沒有回報。只有typedef s。

順便說一句,你的示例代碼看起來不像一個元函數。元函數是毛茸茸的野獸,它利用SFINAE來完成C++本來不打算實現的內容(例如反射)。您的generate_callback_map只是用於模板typedef的C++ 03替身。

你缺少的是關於你的typedefs的文檔和關於如何使用這個模板的文檔。

/// @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和相關/兼容的文檔生成器的角度來看,試圖用'@ return'來標記示例中的任何內容只會混淆它。 @ david的例子typedef文檔提供了這個功能,並且是明確的,但是可以通過關於結構本身的簡要文檔來擴充。 –