我创建了以下Matrix类:
template <typename T>
class Matrix
{
static_assert(std::is_arithmetic<T>::value,"");
public:
Matrix(size_t n_rows, size_t n_cols);
Matrix(size_t n_rows, size_t n_cols, const T& value);
void fill(const T& value);
size_t n_rows() const;
size_t n_cols() const;
void print(std::ostream& out) const;
T& operator()(size_t row_index, size_t col_index);
T operator()(size_t row_index, size_t col_index) const;
bool operator==(const Matrix<T>& matrix) const;
bool operator!=(const Matrix<T>& matrix) const;
Matrix<T>& operator+=(const Matrix<T>& matrix);
Matrix<T>& operator-=(const Matrix<T>& matrix);
Matrix<T> operator+(const Matrix<T>& matrix) const;
Matrix<T> operator-(const Matrix<T>& matrix) const;
Matrix<T>& operator*=(const T& value);
Matrix<T>& operator*=(const Matrix<T>& matrix);
Matrix<T> operator*(const Matrix<T>& matrix) const;
private:
size_t rows;
size_t cols;
std::vector<T> data;
};
我尝试使用std :: complex矩阵:
Matrix<std::complex<double>> m1(3,3);
问题是编译失败(static_assert失败):
$ make
g++-mp-4.7 -std=c++11 -c -o testMatrix.o testMatrix.cpp
In file included from testMatrix.cpp:1:0:
Matrix.h: In instantiation of 'class Matrix<std::complex<double> >':
testMatrix.cpp:11:33: required from here
Matrix.h:12:2: error: static assertion failed:
make: *** [testMatrix.o] Error 1
为什么std :: complex不是算术类型?我想启用无符号int(N),int(Z),double(R),std :: complex(C)的使用,也许还有一些自制的类(例如代表Q的类)...有可能获得这种表现?
编辑1:如果我删除static_assert
该课程正常工作。
Matrix<std::complex<double>> m1(3,3);
m1.fill(std::complex<double>(1.,1.));
cout << m1 << endl;
答案 0 :(得分:14)
arithmetic
中的is_arithmetic
用词不当。或者更确切地说,它是一个C ++ - nomer。它与英语中的含义并不相同。它只是意味着它是内置数值类型之一(int,float等)。 std::complex
不是内置的,而是一个类。
你真的需要static_assert
吗?为什么不让用户尝试任何类型?如果类型不支持所需的操作,那么运气不好。
答案 1 :(得分:1)
您可以使用通常不被视为“数字”的类型矩阵来执行有趣的操作。矩阵和向量实际上从数字推广到多种“代数环” - 基本上,任何通常的+和*运算定义的对象集。
因此,您可以使用向量,其他矩阵,复数等矩阵。任何支持加,减和乘法运算符的类或基元类型都可以正常工作。 如果正确定义运算符,隐式编译炸弹应该捕获大多数滥用,例如“matrix&lt; std :: string&gt;”。