C++ の (非常に多くの) 残念な設計上の欠陥の 1 つは、テンプレート メタプログラミングを使用する場合、実装をインターフェイスから分離することが基本的に不可能であることです。
私のライブラリには、次のようなものがあります。
template <typename Ma, typename Mb>
typename boost::enable_if_c<
detail::IsMatrix<Ma>::val and detail::IsMatrix<Mb>::val and
detail::MatrixDimensionCheck<Ma,Mb>::isStaticMatch,
bool>::type
operator==(const Ma &a, const Mb &b) {
return detail::matrixEqual(a,b);
}
これが読めなくても、私はあなたを責めません。この混乱のほとんどは、引数が行列で次元が一致する場合は戻り値の型を定義し、bool
それ以外の場合は未定義に定義するだけです (したがって、この演算子が他の重要なものを隠すのを防ぐために SFINAE に依存しています)。
本質的に静的な型チェック関数の内臓が通常の C++ 関数のシグネチャに埋め込まれているため、これらの実装内臓が生成されたドキュメントに表示されます。
ユーザーがこれを読む必要はありません。彼らが知る必要があるのは、この関数が a を返すことだけですbool
(上記を読んでも、これを知ることはほとんど不可能です)。ドキュメントでは、この演算子が行列のみを受け入れることを平易な英語で簡潔に説明できます。
そのタイプの混乱を としてレンダリングするように Doxygen を説得する方法はありbool
ますか? (これをコードで直接クリーンアップする方法は多かれ少なかれないと思いますが、何か考えられることがあればアイデアを歓迎します)。