您可以編寫自己的包裝函數模板:
// Precondition: !container.empty()
// Exception safety: If there is an exception during the construction of val,
// the container is not changed.
// If there is an exception during the return of the value,
// the value is lost.
template <typename C>
auto back_popper(C & container) -> decltype(container.back())
{
auto val(std::move(container.back()));
container.pop_back();
return val;
}
用法:
auto element = back_popper(myDeque);
不能圍繞激勵擺在首位的back()
和pop_back()
分離的根本問題得到哪些是元素的複製或移動構造函數可能會拋出異常,並且在發生這種情況時可能會丟失彈出的元素。您可以通過返回一個非投擲對象來緩解它,例如,一個unique_ptr
,這將交易掉動態分配元素的風險,但顯然這是你必須作出的標準不適合你的個人選擇。
例如:
// Guarantees that you either get the last element or that the container
// is not changed.
//
template <typename C>
auto expensive_but_lossless_popper(C & container)
-> typename std::unique_ptr<decltype(container.back())>
{
using T = decltype(container.back());
std::unique_ptr<T> p(new T(std::move(container.back())));
container.pop_back();
return p; // noexcept-guaranteed
}
編輯:我加繞back()
電話std::move
,作爲@simple建議。這是合法的,因爲不再需要移動元素,而且許多現實世界的類不帶移動構造函數,因此覆蓋了大量情況,「無損」解決方法僅爲少量沒有任何異動的「奇怪」類型移動。
刪除'[java]'作爲答案不是關於Java。 –