Один из (так много) неудачных недостатков дизайна С++ заключается в том, что в принципе невозможно отделить реализацию от интерфейса при использовании метапрограммирования шаблонов.
Во всей библиотеке у меня есть такие вещи, как:
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);
}
Если это невозможно прочитать, я не обвиняю вас. Большая часть этого беспорядка просто определяет тип возвращаемого значения как bool, если аргументы являются матрицами и соответствием размерности, и undefined, если они что-то другое (таким образом, полагаясь на SFINAE, чтобы этот оператор не скрывал другие важные вещи).
Так как кишки того, что по существу является статической функцией проверки типов, теперь встроены в подпись моей обычной функции С++, эти кишки реализации появятся в сгенерированной документации.
Я не хочу, чтобы пользователь должен был прочитать это. Все, что им нужно знать, это то, что эта функция возвращает bool (что почти невозможно сказать, прочитав выше). В документах я могу кратко, на простом английском языке, объяснить, что этот оператор принимает только матрицы.
Есть ли способ убедить Doxygen сделать этот беспорядок типа bool? (Я предполагаю, что более или менее нет возможности очистить это в коде напрямую, но идеи приветствуются, если вы можете что-то придумать).