Группировка перегрузок в doxygen
В моей библиотеке у меня много перегрузок функций формы:
/// \brief Does thing.
///
/// \details The thing that is done is very special.
template<typename T>
void do_stuff(const T& t);
/// \brief Does thing repeatedly.
/// \copydetails do_stuff()
template<typename T>
void do_stuff(const T& t, std::size_t x);
Это, в общем, работает и довольно приятно, но создает то же самое
раздел документации несколько раз. Я хочу, чтобы сгруппировать эти
функционирует вместе. На подробное описание и каждый
перегрузки аннотированы с ним краткое описание. Я тоже не прочь
к псевдонимам, которые могли бы сделать что-то вроде этого или ввести фильтры.
Один из способов представить это можно:
Результат документации должен выглядеть следующим образом:
template<typename T>
void do_stuff(const T& t); (1)
template<typename T>
void do_stuff(const T& t, std::size_t x); (2)
The things that is done is very special.
(1) Does thing.
(2) Does thing repeatedly.
Конечно, я могу создать новую страницу и написать такую документацию
но мне потребовалось бы повторить объявления функций
на страницу, а затем перфорировать ссылки в действительную функцию
документация, но это скорее взлом, чем что-либо еще.
Есть ли способ достичь этого легко? Даже намеки взломать его в
doxygen будет оценен.
Ответы
Ответ 1
К сожалению, у Doxygen действительно нет механизма для этого. Самое близкое, что вы можете получить, это группы участников, но они не делают то, что вам нужно (они появляются только в списке прототипов участников).
Взломать его в Doxygen, не изменяя сам Doxygen, как правило, будет включать в себя анализ XML-формата, который представляет собой ряд проблем. Во-первых, его формат XML ужасен для того, чтобы делать что-нибудь полезное (поверьте, я пробовал). Во-вторых, нет синтаксиса для создания связи между этими функциями. Строка copydetails
похожа на #include
в C/С++; он не оставляет следов после включения. Поэтому вы не можете сказать, когда он был фактически использован.
В-третьих, вы выбрасываете все другие форматы, которые предоставляет Doxygen. Вы бы написали полный генератор для любого формата, который вас интересует.
Модификация самого Doxygen для поддержки этого будет включать в себя несколько шагов. Во-первых, вам нужно добавить специальную грамматику, которая связывает команды. Это включает в себя изменение класса FuncDef
для ссылки на другой FuncDef
, с которым он сгруппирован. Во-вторых, вам нужно изменить генератор HTML, чтобы сгенерировать их в одном месте. Это будет намного сложнее, чем кажется. Если только исходный код Doxygen не стал намного лучше с тех пор, как я его последний раз видел, это будет серьезной болью.
Генератор HTML имеет некоторые базовые предположения о том, какие ссылки на что и что вы ищете, разрывает их. И помните: вы не первый человек, который хотел этого от Doxygen. И все же это еще не сделано. Одна из причин заключается в том, что он не является тривиальным для реализации. Хотя честно, я полагаю, что другая причина заключается в том, что Димитрий просто не верит, что это то, что документация должна когда-либо делать.
Ответ 2
Вы можете использовать тег @name для достижения аналогичной функциональности.
Взгляните на этот простой пример.
/**
* @name Appends data to the container.
*
* @param tag Name of the data entry
* @param value Data value
*/
//@{
/**
* @brief Documentation for this overload
*/
void append(const std::string & tag, bool value);
/**
* @brief Documentation for this overload
*/
void append(const std::string & tag, int8_t value);
void append(const std::string & tag, int16_t value);
void append(const std::string & tag, int32_t value);
//@}
Он производит следующий вывод: ![enter image description here]()
Я надеюсь, что это поможет