Doxygen для специализации класса шаблонов шаблонов С++

Когда я пишу шаблоны классов и нуждаюсь в полной специализации членов этих классов, Doxygen не распознает специализацию - он документирует только общее определение или (если есть только специализации) последнее определение. Вот простой пример:

=== MyClass.hpp ===

#ifndef MYCLASS_HPP
#define MYCLASS_HPP

template<class T> class MyClass{
public:
    static void foo();
    static const int INT_CONST;
    static const T TTYPE_CONST;
};

/* generic definitions */
template<class T>
void MyClass<T>::foo(){
    printf("Generic foo\n");
}

template<class T>
const int MyClass<T>::INT_CONST = 5;

/* specialization declarations */
template<> void MyClass<double>::foo();
template<> const int MyClass<double>::INT_CONST;
template<> const double MyClass<double>::TTYPE_CONST;
template<> const char MyClass<char>::TTYPE_CONST;

#endif

=== MyClass.cpp ===

#include "MyClass.hpp"

/* specialization definitions */
template<>
void MyClass<double>::foo(){
    printf("Specialized double foo\n");
}

template<> const int MyClass<double>::INT_CONST = 10;

template<> const double MyClass<double>::TTYPE_CONST = 3.141;
template<> const char MyClass<char>::TTYPE_CONST = 'a';

Итак, в этом случае foo() будет документирован как печать "Generic foo", INT_CONST будет задокументирован как установленный на 5, без упоминания специализаций, и TTYPE_CONST будет задокументирован как установленный в "a", с нет упоминания о 3.141 и никаких указаний на то, что "а" является специализированным случаем.

Мне нужно иметь возможность документировать специализации - либо в документации для MyClass<T>, либо на новых страницах для MyClass<double>, MyClass<char>. Как мне это сделать? Может ли Doxygen справиться с этим? Могу ли я сделать что-то неправильно в структуре деклараций/кодов, что позволяет Doxygen понять, что я хочу?

Я должен отметить два связанных случая:

A) Для шаблонных функций специализация работает нормально, например:

/* functions that are global/in a namespace */
template<class T> void foo(){ printf("Generic foo\n"); }
template<> void foo<double>(){ printf("Specialized double foo\n"); }

Это будет документировать как foo<T>(), так и foo<double>().

B) Если я переопределяю весь шаблон, т.е. template<> class MyClass<double>{...};, то MyClass<double> получит свою собственную страницу документации в качестве отдельного класса. Но это означает, что на самом деле объявляется совершенно новый класс - между MyClass<T> и MyClass<double> нет отношения, если объявляется сама MyClass<double>. Поэтому мне придется переопределить класс и все его члены, и повторить все определения членов класса, специализированные для MyClass<double>, чтобы все выглядело так, как будто они используют один и тот же шаблон, Очень неудобно, он чувствует, как раствор для осадка.

Предложения? Большое спасибо:)

- Зив

Ответы

Ответ 1

Дальнейший поиск указывает, что эта проблема была открытая ошибка, исправленная в Doxygen 1.8.10.

Ответ 2

Эта ошибка, по-видимому, исправлена ​​3 недели назад