ich ein RPC-System bin Implementierung entworfen Aufgaben in Remote-Prozesse auszuführen. Ein Knoten des RPC-Systems ist Monitor, der jeden Anruf protokollieren sollte.Speichern und Rückkehr gattungsgemäßen Art (auch void) aus Funktion
template<typename Transport, typename Journal>
class Monitor
{
public:
Monitor(Transport transport, Journal &journal) :
transport{std::move(transport)},
journal{journal}
{
}
public:
template<typename Method>
typename Method::Result operator()(const Method &method)
{
Method::Result result;
journal("->", Method::Name());
result = transport(method);
journal("<-", Method::Name());
return result;
}
private:
Transport transport;
Journal &journal;
};
Es funktioniert gut außer einem Fall, wenn Methode :: Ergebnis ist ungültig. Um dies zu umgehen ich operator() in 2 Teile
template<typename Transport, typename Journal>
template<typename Method>
std::enable_if_t<std::is_same<typename Method::Result, void>::value, typename Method::Result> operator()(const Method &method)
{
journal("->", Method::Name());
transport(method);
journal("<-", Method::Name());
}
template<typename Transport, typename Journal>
template<typename Method>
std::enable_if_t<!std::is_same<typename Method::Result, void>::value, typename Method::Result> operator()(const Method &method)
{
Method::Result result;
journal("->", Method::Name());
result = transport(method);
journal("<-", Method::Name());
return result;
}
Gibt es eine Möglichkeit Copy-Paste zu teilen hatte zu beseitigen, dass die Linie unter der Annahme journal("<-", Method::Name());
soll nicht im Fall einer Ausnahme ausgeführt werden (so kann ich nicht wrap Anmeldung in Konstrukt/Destruktor)?
Vielen Dank für Vorschlag. Habe noch nie von std :: uncaught_exception gehört. Der einzige Nachteil ist, dass die Überprüfung in der Laufzeit durchgeführt wird und ich dafür eine Leistungseinbuße zahlen muss – sliser