私は積分型(short、int、long)と浮動小数点型(float、double)の両方をとるMatrixクラスに取り組んでいます。 いくつかのメソッドを浮動小数点型(inversionメソッドなど)に限定し、いくつかのメソッドを浮動型および整数型(==演算子など)に対して異なる実装にする必要があります。 ブーストの「enable_if」と「is_integral」/「is_floating_point」を使用するのが正しい方法ですが、動作させることができません。タイプが整数型か浮動小数点型かに基づいてテンプレートメソッドを変更するにはどうすればよいですか?
error: no type named ‘type’ in ‘struct boost::enable_if<boost::is_integral<float>, float>’
と:私はこれらが最も関連性の高いものだと思う一方で、これはコンパイルエラーの多くを生産する
template <typename T>
class Matrix
{
...
bool operator==(Matrix<typename enable_if<is_integral<T> T >::type >) const;
bool operator==(Matrix<typename enable_if<is_floating_point<T>::type T> >) const;
typename enable_if<is_floating_point<T> T> computeInverse() const;
...
};
// implementation
bool Matrix<T>::operator==(Matrix<typename enable_if<is_integral<T> T >::type >) const {
//implementation without precision
}
bool Matrix<T>::operator==(Matrix<typename enable_if<is_integral<T> T >::type >) const {
//implementation using precision
}
Matrix<typename enable_if<is_floating_point<T> T>::type > Matrix<T>::computeInverse() const {
//implementation requiring floating points
}
:
私の実装では、このCに似た何か++半疑似コードであります
error: no type named ‘type’ in ‘struct boost::enable_if<boost::is_floating_point<int>, int>’
これは、異なる実装少なくともブーストのenable_ifを使用しないで、これは正しいですか?
もしそうなら、どうすればよいですか?私は、テンプレートの専門化が行く方法だと知っていますが、あまりにも多くのコードを複製しないようにしたいと思います。
1つのテンプレートに実装を混在させるのではなく、2つの異なるタイプのマトリックスクラス全体を2つの特殊化し、共通部分にベースを分割することができますか? –