Ziv*_*Ziv 15 doxygen template-specialization
当我编写类模板,并且需要对这些类的成员进行完全特化时,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
Run Code Online (Sandbox Code Playgroud)
=== 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';
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,FOO()将被记录为打印"通用富",如设置为5 INT_CONST将被记录在案,没有提到的专业化,并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"); }
Run Code Online (Sandbox Code Playgroud)
这将记录foo<T>()和foo<double>().
B)如果我重新声明整个模板,即template<> class MyClass<double>{...};,然后MyClass<double>将获得自己的文档页面,作为一个单独的类.但这意味着实际上声明了一个全新的类 - 它之间没有任何关系MyClass<T>,MyClass<double>如果MyClass<double>它本身被声明.因此,我必须重新声明该类及其所有成员,并重复所有类成员的定义,专门用于MyClass<double>使其看起来好像是使用相同的模板.非常尴尬,感觉就像一个kludge解决方案.
建议?非常感谢 :)
--Ziv