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