更改功能的输入类型

时间:2014-12-15 16:08:07

标签: c++ input types matrix-multiplication

我在c ++中有一个简单的函数来进行矩阵乘法。我已经将函数定义如下:

void matrix_multiplication(std::vector<std::vector<double> > matrix1 , std::valarray<std::valarray<double> > matrix2,
                       std::vector<std::vector<double> > &result)

现在在代码的某些不同部分,我再次需要调用这个完全相同的函数,但使用不同的输入类型,即向量。而不是像下面那样定义另一个与matrix_multiplication完成相同工作的函数:

void matrix_multiplication2(std::vector<double>matrix1 ,std::valarray<double> matrix2,
                           std::vector<std::vector<double> > &result)

我想问一下,是否有可能以某种方式改变函数的两个不同调用中的输入类型。

4 个答案:

答案 0 :(得分:2)

实际上,您有几个选择:

1)重载您的方法以接受正确的参数。这个用例正是我们开始函数重载的原因。

2)在将参数传递给现有函数之前转换它们。这有点难看,如果多次完成,最终可能看起来很混乱。

3)实际上写(或找到)一个Matrix库并完全避免这个问题。这是我的首选解决方案,但是,如果不知道您的问题的域名,可能会有点矫枉过正。

答案 1 :(得分:2)

  

&#34;我想询问是否有可能以某种方式改变函数的两个不同调用中的输入类型。 &#34;

您可以将该函数设为模板(假设参数的所有操作对于传递的任何容器类型都同样有效):

template<typename Container, typename ValArray>
void matrix_multiplication( Container matrix1
                          , ValArray matrix2
                          , Container &result) {
    // Implementation ...
}

答案 2 :(得分:0)

看看c ++中的模板,它允许你用c ++做这些事情。 您可以编写模板通用函数,然后根据需要为每种类型编写特化。

看看这个tuto:

http://www.cplusplus.com/doc/tutorial/templates/

答案 3 :(得分:0)

简短的回答是使用模板:

template <typename T>
void matrix_multiplication(std::vector<std::vector<T> > matrix1 , std::valarray<std::valarray<T> > matrix2,
                   std::vector<std::vector<T> > &result)

通用编程FTW!但是,你在这里重新发明轮子......写一个好的通用库是很难的,线性代数更难,而不是你想象的那么简单。我建议Eigen或犰狳。我的意思是,根据你的功能,我猜你有一个O(n ^ 3)乘法解,当最有效率小于那时,见http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations