2017-06-08 57 views
1

我们组最近转向了C++。我的主管非常友好,可以提供一个由许多类和相关方法组成的模板。我发现的问题是,大多数方法需要大量的输入参数,就像这样:缩短C++函数输入参数?

void AdvectionReactionDiffusion::boundary(const arma::Col<double>& n, const arma::Col<double>& u, const arma::Col<double>& uhat, const arma::Col<double>& fhat, arma::Col<double>& fb, arma::Mat<double>& fb_u, arma::Mat<double>& fb_uhat, arma::Mat<double>& fb_fhat) const {} 

因此,为了更好的可读性,减少人为错误的原因,有没有什么好的方法可以缩短这些投入没有打破代码的当前结构?

我来自Python的背景,我将在Python中做什么将相关输入包装在一个命名的元组中,并将其扔在函数中。但我不知道如何在C++中应用类似的技巧。

+7

你不应该问你的主管*(老师?)那个问题吗? –

+0

你想提供命名的可选参数吗?将参数类型从函数签名中分离出来?将参数组转发到另一个函数? –

+0

该函数有4个_out_参数,但不返回任何内容!可能是时候看看您是否可以打破功能 – Tas

回答

5

如果你读ColMat的文档,你会发现

enter image description here

enter image description here

using namespace arma;cpp文件(从来没有在头)结合这个你可以做

void AdvectionReactionDiffusion::boundary(const vec& n, 
              const vec& u, 
              const vec& uhat, 
              const vec& fhat, 
              vec& fb, 
              mat& fb_u, 
              mat& fb_uhat, 
              mat& fb_fhat) const {} 

您已标记此问题因此,您不必输出参数,也可以返回std::tuple

std::tuple<vec,mat,mat,mat> 
AdvectionReactionDiffusion::boundary(const vec& n, 
            const vec& u, 
            const vec& uhat, 
            const vec& fhat) const {} 

然后你就可以解压使用std::tie

std::tie(fb, fb_u, fb_uhat, fb_fhat) = ARD.boundary(n,u,uhat,fhat); 

当然你也可以做同样的输入参数。

+0

[不要使用命名空间](https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice)在任何非平凡的项目 –

+0

@PasserBy我经常做那只是在当地范围内。否则,编写含有大量'std :: sin'和'std :: exp'等的数学表达式将会非常痛苦。 –

+0

我同意打字很单调,但我个人认为这是C++的缺陷。我想说如果范围解析运算符不是**两个**,而**需要按下shift **,那么范围解析运算符将会非常不痛苦** –