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