【发布时间】:2016-10-14 02:20:03
【问题描述】:
我的问题肯定很愚蠢,但是我对 C++11 和模板编程的理解有很多漏洞,以至于我不知道如何解决这个问题。
我正在推出我自己的非常简单的线性代数库:
typedef short index_t;
template<int M, int N, typename T = double>
class mat {
// may want some specialized constructors for mat<1,N,T> and mat<M,1,T>
public:
T& operator()(index_t i, index_t j) {
return buf[i + j*M];
}
T& operator[](index_t k) { // useful for special cases where matrix is vector
return buf[k];
}
// etc...
private:
std::array<T, M*N> buf;
}
typedef mat<2, 1, double> col2d;
typedef mat<3, 1, double> col3d;
typedef mat<1, 2, double> row2d;
typedef mat<1, 3, double> row3d;
typedef mat<2, 2, double> mat2d;
typedef mat<3, 3, double> mat3d;
我只是希望它支持一种直接分配(或至少初始化)向量(即具有单维数的矩阵)的方法。例如,我希望能够做到v = col2d(v1,v2) 或至少col2d v = {v1,v2}。我的印象是公开buf 可能会允许col2d v = {{v1, v2}},但我不喜欢公开buf 的想法。我并不热衷于为每个 (1,N) 和每个 (M,1) 编写一个专门的构造函数。我试图使库尽可能简单易读。
有什么建议吗?
【问题讨论】:
-
mat2d x = {{ 1,2,3,4 }};怎么样?我发现这种初始化在实践中很有用。col2d和row2d是否应该以相同的方式初始化? `mat2d x = { as_flat, {1,2,3,4} }; 怎么样? -
或
mat3d x = {diagonal, 1,2,3};?它是否必须来自一个数组或单独的{},或者采用N*M值来转换听起来不错?在 1 到 10 的范围内,你有多疯狂地喜欢元编程?运行时边界/大小检查是否足够好?确定不想暴露buf? C++17 可以吗? -
初始化矩阵很好,但我宁愿做
M(i,j)=mij而不是学习元编程。当然,行和列可以以相同的方式初始化,除了在使用构造函数时的构造函数名称。采用N*M值听起来不错。 3/10。公开buf并非不可能——只是不情愿。没有 C++17。
标签: c++ c++11 templates template-meta-programming aggregate-initialization