Seite 1 von 1

[C++] bequeme Automatisierung von create()/trycatch/clear()

Verfasst: 26.04.2023, 11:36
von Schrompf
Moin,

ich habe zweihundertdreiundfünfzig Versionen von folgendem Code

Code: Alles auswählen

try {
  auto* thing = grpcResponse->mutable_thing(); // creates a submessage
  thing->set_x( conversion_which_might_throw(sourceValue.x));
  ...
} catch(const std::exception&) {
  grpcResponse->clear_thing(); // deletes the submessage
}
Gibt's irgendne coole Methode, das zu automatisieren? Das Problem ist hier die clear_something()-Funktion - die muss zur Creation-Funktion passen. Die müsste ich als PointerToMember reinreichen, und das wär ausnehmend hässlich in Übergabe und Anwendung. Sonst fallen mir nur MACROS ein, aber das ist in modernen Codebases ja ein bissl verpönt.

Hat jemand ne Idee?

Re: [C++] bequeme Automatisierung von create()/trycatch/clear()

Verfasst: 26.04.2023, 12:25
von Schrompf
Hab's jetzt nach Diskussion im IRC mit nem Cleanup-Lambda gelöst:

Code: Alles auswählen

void setOrClearPosition(const Vector3f& src, some::grpc::namespace::Vector3f* target, auto cleanupFunc) {
  try {
    target->set_x(throwing_conversion(src.x()));
    ...
  } catch(std::exception) {
    cleanupFunc();
  }
}
Dann ist zwar die Erzeugung der SubMessage nicht Teil des Vorgangs, obwohl sie thematisch eigentlich dazu gehört, aber das war nur ein prinzipielles Bedenken, dafür füg ich keinen zweiten Lambda ein

Re: [C++] bequeme Automatisierung von create()/trycatch/clear()

Verfasst: 26.04.2023, 13:22
von Krishty
Warum kein catch-by-Reference mehr? :P

Re: [C++] bequeme Automatisierung von create()/trycatch/clear()

Verfasst: 26.04.2023, 21:17
von NytroX
Wenn es das bei deinem Compiler gibt, kannst du auch std::experimental::scope_fail benutzen.
https://en.cppreference.com/w/cpp/exper ... scope_fail