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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

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

Beitrag von Krishty »

Warum kein catch-by-Reference mehr? :P
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
NytroX
Establishment
Beiträge: 358
Registriert: 03.10.2003, 12:47

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

Beitrag 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
Antworten