我正在研究一个 Matrix 类,它同时采用整数(short、int、long)和浮点类型(float、double)。我希望某些方法仅限于浮点类型(例如反转方法),并且某些方法对浮点类型和整数类型具有不同的实现(例如 == 运算符)。我有一种预感,正确的方法是使用 boost 的“enable_if”和“is_integral”/“is_floating_point”,但我似乎无法让它工作。
我的实现类似于这个 c++ 半伪代码:
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
}
这会产生很多编译错误,而我认为这些是最相关的:
error: no type named ‘type’ in ‘struct boost::enable_if<boost::is_integral<float>, float>’
和
error: no type named ‘type’ in ‘struct boost::enable_if<boost::is_floating_point<int>, int>’
这表明我不能对不同的类型有不同的实现,至少不使用boost的enable_if,这样对吗?
如果是这样,我该怎么做?我知道模板专业化是一种方法,但我想避免重复太多代码。