使用预处理器宏。下面是the not-yet-official Boost.XInt library一个例子(目前排队等待审核列入升压):
#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
使用#define
d宏名代替模板参数,到处都需要他们,就像这样:
/*! \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
并把这样的诗句中的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
结果是Doxygen的看到无论是“...”或‘其他’为模板参数,编译器会看到真实的。如果您在课程本身的文档中描述了模板参数,那么图书馆的用户只需要在他可能寻找他们的地方看到他们;他们会隐藏在其他地方。
作为此设计的另一个优点,如果您需要更改模板参数列表,则只需在宏定义和实际使用更改参数的功能中对其进行更改。其他一切都会自动适应。
我认为你需要编写适当的文档,使用文字处理器。如果我遇到了这种常见的doxy生成的文档(不管多加多少注释),我想我可能会说“不,谢谢”。但是,我可能会这样说:-) – 2010-08-08 17:11:54
这正是我在C++中远离模板元编程的原因。这很荒谬。 – You 2010-08-08 17:17:09
@你有没有更好的方式去做,而不是任何语言 – Anycorn 2010-08-08 17:48:19