Utilisez des macros de préprocesseur. Voici un exemple de the not-yet-official Boost.XInt library (actuellement en attente d'examen pour l'inclusion dans Boost):
#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
Utilisez les #define
d noms de macros au lieu des paramètres du modèle, partout où vous en avez besoin, comme ceci:
/*! \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
et mettre des lignes comme celles-ci dans le 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
le résultat est que Doxygen voit soit « ... » ou « autre » pour les paramètres du modèle, et le compilateur voit les vrais. Si vous décrivez les paramètres du modèle dans la documentation pour la classe elle-même, alors l'utilisateur de la bibliothèque n'aura qu'à les voir au même endroit où il est susceptible de les chercher; ils seront cachés partout ailleurs. Comme avantage supplémentaire à cette conception, si vous avez besoin d'apporter des modifications aux listes de paramètres du modèle, il vous suffit de les modifier dans les définitions de macro et les fonctions qui utilisent réellement les paramètres modifiés. Tout le reste s'adaptera automatiquement.
Je pense que vous devez écrire une documentation appropriée, en utilisant un traitement de texte. Si je suis tombé sur les docs générés par doxy habituels (peu importe combien d'annotation supplémentaire vous ajoutez) pour des trucs comme ça, je pense que je dirais probablement "non merci". Mais alors je le dirais probablement de toute façon :-) –
C'est exactement pourquoi je reste loin de la métaprogrammation de template en C++. C'est ridicule. – You
@Vous n'avez pas de meilleure façon de le faire, pas dans n'importe quelle langue – Anycorn