クラステンプレートを作成し、それらのクラスのメンバーを完全に特殊化する必要がある場合、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であり、「a」が特殊なケースであるという表示はありません。
MyClass<T>
のドキュメント内、またはの新しいページでMyClass<double>
、専門分野をドキュメント化できる必要がありますMyClass<char>
。どうすればよいですか?Doxygenはこれを処理することさえできますか?Doxygenが私が欲しいものを理解するのを妨げている宣言/コード構造で何か間違ったことをしている可能性がありますか?
2つの関連するケースに注意する必要があります。
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