隐藏Doxygen的模板实现细节

trb*_*abb 16 c++ templates doxygen

C++的一个(如此多)不幸的设计缺陷是,当使用模板元编程时,基本上不可能将实现与接口分开.

在我的图书馆里,我有类似的东西:

template <typename Ma, typename Mb>
typename boost::enable_if_c<
            detail::IsMatrix<Ma>::val and detail::IsMatrix<Mb>::val and
            detail::MatrixDimensionCheck<Ma,Mb>::isStaticMatch, 
        bool>::type
operator==(const Ma &a, const Mb &b) {
    return detail::matrixEqual(a,b);
}
Run Code Online (Sandbox Code Playgroud)

如果这是不可读的,我不怪你.bool如果参数是矩阵并匹配维度,那么大部分混乱只是定义返回类型,如果它们是其他东西则是未定义的(因此依赖SFINAE来防止此运算符隐藏其他重要事物).

由于本质上是静态类型检查函数的内容现在已嵌入到我的普通C++函数的签名中,因此这些实现内容将出现在生成的文档中.

我不希望用户必须阅读此内容.他们需要知道的是,这个函数返回一个bool(通过阅读上面几乎不可能知道).在文档中,我可以用简单的英语简洁地解释这个操作符只接受矩阵.

有没有办法说服Doxygen将那种类型弄得乱七八糟bool?(我假设在代码中或多或少没有办法在代码中直接清除它,但如果你能想到某些东西,欢迎这些想法).

dun*_*123 -1

我想这可能对你有用。显然,这是一个比您的示例更简单的示例,但基本思想是使用记录的模板函数,而不enable_if调用另一个未记录但提供 SFINAE 的“隐藏”函数。

// Ignore this function in doxygen
template <typename T>
typename boost::enable_if<boost::is_unsigned<T>, bool>::type
test_hidden(T t) {
    return true;
}

template <typename T>
typename boost::disable_if<boost::is_unsigned<T>, bool>::type
test_hidden(T t) {
    return false;
}

// Document this function
template <typename T>
bool test(T t)
{
    return test_hidden(t);
}

int main()
{
   unsigned int a = 1;
   int b = 0;

   std::cout << test(a) << std::endl; // true
   std::cout << test(b) << std::endl; // false

   return 0;
}
Run Code Online (Sandbox Code Playgroud)