Wdrażam system RPC przeznaczony do wykonywania zadań w zdalnych procesach. Jeden węzeł systemu RPC to Monitor, który powinien rejestrować każde wywołanie.Przechowywanie i zwracanie ogólnego typu (nawet nieważne) z funkcji
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;
};
Działa dobrze, z wyjątkiem jednego przypadku, gdy Metoda: Wynik jest nieważny. Aby obejść ten musiałem podzielić operatora() na 2 części
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;
}
Czy istnieje jakiś sposób, aby wyeliminować kopiuj-wklej, przy założeniu, że linia journal("<-", Method::Name());
nie powinny być wykonywane w przypadku wystąpienia wyjątku (więc nie mogę wrap logging in construct/destructor)?
Dziękuję za sugestię. Nigdy wcześniej nie słyszałem o std :: uncaughttexexception. Jedynym minusem jest to, że kontrola wykonywana jest w czasie pracy i muszę zapłacić za nią wydajność – sliser