2013-11-09 15 views
2

我想制作一个数学库,并且想知道是否可以直接将uninitialised_list乘上一个矩阵,而不是先将它包装在一个向量中。将矩阵乘以一个initializer_list是否可能?

我想获得像这样的东西。

Matrix<double> M = {{1, 1}, {2, 2}}; 
vector<double> v = M * {2.0, 2.0}; 

矩阵初始化工作得很好。所以Matrix M是一个2x2矩阵。我想用矢量{2.0,2.0}乘这个M,但是我得到了跟随误差。

error: expected primary-expression before '{' token 
    vector<double> v = M * {2.0, 2.0}; 

我的问题是这实际上可能在c + +?

我的重载操作符*将接受initializer_list如下。

template<typename T> 
vector<T> Matrix<T>::operator*(const initializer_list<T> &list) 
{ 
    vector<T> result(list.size(), 0.0); 

    for (size_t i = 0; i < d_rows; ++i) 
    { 
    for (size_t j = 0; j < d_cols; ++j) 
    { 
     result[i] = d_matrix[i][j] * *(list + j); 
    } 
    } 
    return result; 
} 
+0

我认为这是不允许的语法。然而,'M.operator *({2.0,2.0})'应该可以工作。 – dyp

+0

然而,这并不直观...... – Montaldo

+1

或者,'使用ili = std :: initializer_list ; auto v = M * ili {2.0,2.0};'(或者通过推导'int','auto v = M * deduce({2.0,2.0});') – dyp

回答

0

初始化应该用于初始化。我不这样做,但有一些解决方法:

vector<T> Matrix<T>::operator*(std::initializer_list<double> a) 
{ 
    .... 
} 

auto v = M * std::initializer_list<double>{2.0, 2.0}; 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
      // Make an initialized object 

但它不适合和足够可读。我更喜欢类似下面的代码:

auto v = M * Matrix<double>{2.0, 2.0}; 
      ^^^^^^^^^^^^^^^^^^^^^^^^^ 
       // Initialized Matrix 
+0

您忘记了括号。 'auto v = M * std :: initializer_list ({2.0,2.0});'完全正常工作 – Montaldo

+1

BTW:有一个矩阵运算符* =接受一个initializer_list并返回一个(数学)向量:v = m * = {1 ,2,3}编译罚款(海湾合作委员会4.7.2) –

+0

但这将是一个奇怪的使用* =右? cuz矩阵mult一个向量产生的不是一个矩阵的向量 – Montaldo