Cuando escribo plantillas de clase y necesito especializar a los miembros de esas clases, Doxygen no reconoce la especialización; documenta solo la definición genérica o (si solo hay especializaciones) la última definición Aquí hay un ejemplo simple:Doxygen para la especialización de miembro de la clase de plantilla 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';
lo tanto, en este caso, foo() lo hará documentarse como impresión "Foo genérico", INT_CONST se documentará como establecido en 5, sin mencionar las especializaciones, y TTYPE_CONST se documentará como 'a', sin mención de 3.141 y sin indicación de que 'a' esté un caso especializado.
Necesito poder documentar las especializaciones, ya sea dentro de la documentación para MyClass<T>
, o en páginas nuevas para MyClass<double>
, MyClass<char>
. ¿Cómo hago esto? ¿Puede Doxygen incluso manejar esto? ¿Acaso estoy haciendo algo mal en la estructura de declaración/código que impide que Doxygen comprenda lo que quiero?
deben tener en cuenta dos casos relacionados:
a) Para las funciones de plantilla, la especialización funciona bien, por ejemplo .:
/* 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"); }
Esto documentará tanto foo<T>()
y foo<double>()
.
B) Si redeclaro la plantilla completa, es decir, template<> class MyClass<double>{...};
, entonces MyClass<double>
tendrá su propia página de documentación, como una clase separada. Pero esto significa en realidad declarar una clase completamente nueva: no existe relación entre MyClass<T>
y MyClass<double>
si se declara MyClass<double>
. Así que tendría que redeclarar la clase y todos sus miembros, y, repetir todas las definiciones de los miembros de la clase, especializados para MyClass<double>
, todos para hacer que parezca que están usando la misma plantilla. Muy incómodo, se siente como una solución de kludge.
Sugerencias? Gracias tanto :)
--Ziv