我正在討論如何正確處理容器參數。我應該清除()容器作爲參數傳入還是交換新對象?
我們有一個函數,它在容器參數,並希望只返回裝滿容器什麼功能付諸它:
class bar;
void foo(std::vector<bar> &bars)
{
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
在討論的一個方面,我們有人們說我們應該先bars.clear()
然後運行該功能。
例如:
void foo(std::vector<bar> &bars)
{
bars.clear();
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}
我自己的偏好是試圖儘可能接近我可以達到強異常保證,這意味着建立一個本地容器,灌裝即並在返回之前交換,但在其他方面留下bars
不變。
例如:
void foo(std::vector<bar> &bars)
{
std::vector<bar> localBars;
//do stuff that fills localBars.
//exceptions may be thrown.
//we may also legally return early
if (returnEarly)
{
bars.swap(localBars);
return;
}
//do more stuff that may change localBars
bars.swap(localBars);
return;
}
第一個例子是 '經典' 方法;在做任何事情之前清理你的參數並從那裏開始。
對我來說,第二種方法建立了一個強大的異常保證(假設沒有其他函數可以改變內部狀態),並避免了clear()調用。
挑選一種方法比另一種有什麼優點或缺點?
請注意,對於此功能,強烈的例外保證不是必需的;如果該函數在參數或其他任何內容中沒有任何失敗,那麼在它到達異常處理程序之前,它會起作用。
http://stackoverflow.com/faq:如果你問這個問題的動機是「我想參加關於______的討論」,那麼你不應該在這裏問。 – 2012-04-12 17:06:58
我正在討論...,兩邊的優點和缺點似乎是對我來說完全有效的問題 – Grizzly 2012-04-12 17:08:06
爲什麼不返回結果?那麼這個函數就不會有副作用,這是最強有力的例外保證。 – 2012-04-12 17:09:12