2017-06-08 53 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 **,那麼範圍解析運算符將會非常不痛苦** –