2017-05-07 121 views
0

從MATLAB發佈,我想知道是否有一種方法可以在C++中使用函數參數,就像它在MALTAB中所做的一樣。這裏是一個例子來說明,我正在嘗試在C++中使用:與MATLAB語法的C++函數參數?

draw('shape','circle','radius',5); // should draw a circle 
draw('shape','square','width',3,'hight',4); // should draw a square 

上面的函數是相同的,但函數的參數不同。我想在C++中使用這個語法。有沒有一個好的方法來做到這一點?謝謝。

+1

這真的是你想要的嗎? C++提供了更清晰的解決方案,您不需要依賴字符串,例如多態。一個好處是,如果出現編碼錯誤,您將得到編譯時錯誤,而不是運行時錯誤。而你的IDE會喜歡你的。 – Bernhard

回答

2

你可以嘗試以下的(儘管它不是真正清楚你的主要目的是什麼):

void MyDrawingFunc(const std::vector<std::string>& Arguments) 
{ 
    auto& arg = Arguments[0]; 

    if (arg == "shape") 
     DoShapeStuff(Arguments); // use Arguments[1...] 
    else if (arg == "otherThing") 
      ... 
} 
2

可以使C++工作酷似MATLAB(見回答以上),但它並沒有什麼太大很有道理。一個很好的跡象了那是你的測試用例本身:

draw('shape','square','width',3,'hight',4); // should draw a square 

你拼錯height。在我通常的代碼中,你會得到(運行時)警告「未知說明符hight」,並且有4個被忽略而偏向默認值或者什麼都不做。而這個警告在這裏只是因爲我懶得在otherwise區塊裏寫。許多同事的代碼不會,並且會默默使用默認值或不做任何事情。

現在試着調試,在一個複雜的find some elements on image功能的中間 - 你不會輕易計算出它是在調用draw功能的簡單的拼寫錯誤。

所以,反而讓Matlab代碼在C++中,你應該寫這樣的:

void MyDrawingFunct(Shape shape){ 
...} 

void MyDrawingFunct(Curve curve){ 
...} 

在那裏你會吸引你所定義的形狀(如方形,圓形等),和曲線等其他功能或者,如果你想,以防止發言權增加EllipseShape,並將它在運行時失敗,你可以有更多的功能 - ...(Square ...)

的主要好處是,試圖調用MyDrawingFunct與說Ellipsoid會立即通知你錯誤(在編譯時時間),而按照慣用的MATLAB方式執行操作時,您會想知道ellipsoid是否未實現,或者您是否在某處(如您的示例)發生了錯字。而且你會在運行時觸及它。