Verwenden Sie Präprozessor-Makros. Hier ist ein Beispiel von the not-yet-official Boost.XInt library (derzeit zur Prüfung für die Aufnahme in Boost-Warteschlange):
#ifdef BOOST_XINT_DOXYGEN_IGNORE
// The documentation should see a simplified version of the template
// parameters.
#define BOOST_XINT_INITIAL_APARAMS ...
#define BOOST_XINT_CLASS_APARAMS ...
#define BOOST_XINT_CLASS_BPARAMS other
#define BOOST_XINT_APARAMS ...
#define BOOST_XINT_BPARAMS other
#else
#define BOOST_XINT_INITIAL_APARAMS \
class A0 = parameter::void_, \
class A1 = parameter::void_, \
class A2 = parameter::void_, \
class A3 = parameter::void_, \
class A4 = parameter::void_, \
class A5 = parameter::void_
#define BOOST_XINT_CLASS_APARAMS class A0, class A1, class A2, class A3, \
class A4, class A5
#define BOOST_XINT_APARAMS A0, A1, A2, A3, A4, A5
#define BOOST_XINT_CLASS_BPARAMS class B0, class B1, class B2, class B3, \
class B4, class B5
#define BOOST_XINT_BPARAMS B0, B1, B2, B3, B4, B5
#endif
Verwenden Sie die #define
d Makronamen anstelle der Template-Parameter, überall Sie brauchen sie, wie so:
/*! \brief The integer_t class template.
This class implements the standard aribitrary-length %integer type.
[...lots more documentation omitted...]
*/
template<BOOST_XINT_INITIAL_APARAMS>
class integer_t: virtual public detail::integer_t_data<BOOST_XINT_APARAMS>,
public detail::nan_functions<detail::integer_t_data<BOOST_XINT_APARAMS>::
NothrowType::value, // ...lots more base classes omitted...
{
// ...etcetera
und setzen Zeilen wie diese in der Doxyfile:
PREDEFINED = BOOST_XINT_DOXYGEN_IGNORE
EXPAND_AS_DEFINED = BOOST_XINT_INITIAL_APARAMS \
BOOST_XINT_CLASS_APARAMS \
BOOST_XINT_CLASS_BPARAMS \
BOOST_XINT_APARAMS \
BOOST_XINT_BPARAMS
Das Ergebnis ist, dass Doxygen sieht entweder „...“ oder ‚andere‘ für die Template-Parameter und Der Compiler sieht die echten. Wenn Sie die Vorlagenparameter in der Dokumentation für die Klasse selbst beschreiben, muss der Benutzer der Bibliothek sie nur an der Stelle sehen, an der er sie wahrscheinlich suchen wird. Sie werden überall sonst versteckt sein.
Als zusätzlichen Vorteil dieses Entwurfs müssen Sie, wenn Sie Änderungen an den Vorlagenparameterlisten vornehmen müssen, diese nur in den Makrodefinitionen und den Funktionen ändern, die die geänderten Parameter verwenden. Alles andere passt sich automatisch an.
Ich denke, Sie müssen richtige Dokumentation schreiben, mit einem Textverarbeitungsprogramm. Wenn ich auf die üblichen doxy-generierten Dokumente (egal wie viele zusätzliche Anmerkungen du hinzufügst) für solche Sachen gestoßen bin, würde ich wahrscheinlich "nein danke" sagen. Aber dann würde ich es wahrscheinlich trotzdem sagen :-) –
Das ist genau, warum ich von der Metaprogrammierung der Vorlage in C++ Abstand halte. Es ist lächerlich. – You
@You gibt es keinen besseren Weg, es zu tun, nicht in irgendeiner Sprache – Anycorn