:
// 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()
의 분리 동기를 부여 근본적인 문제를 해결받을 수없는 이 요소의 복사 또는 이동 생성자가 예외를 throw 할 수 있으며이 경우 팝업 된 요소가 손실 될 수 있습니다. 던져지지 않는 객체를 반환하여 사례별로 완화 할 수 있습니다. a 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
}
편집 : @Simple이 제안가 나는 back()
호출 주위 std::move
을 추가했다. 이것은 이동 된 요소가 더 이상 필요하지 않기 때문에 합법적입니다. 많은 실제 클래스에는 noexcept 이동 생성자가 있으므로 많은 경우를 다루며 "무손실"해결 방법은 소수의 noexcept 움직임이없는 "이상한"유형. 디자인으로
답변으로 [java]를 제거하는 것은 Java와 관련이 없습니다. –