Jak byś użył Oczekiwanego Alexandrescu <T> z funkcjami pustymi?

Więc natknąłem się na ten (IMHO) bardzo fajny pomysł użycia złożonej struktury wartości zwracanej i wyjątku -Expected<T>. Przezwycięża wiele wad tradycyjnych metod obsługi błędów (wyjątki, kody błędów).

ZobaczPrzemówienie Andrei Alexandrescu (Systematic Error Handling in C ++) ijego slajdy.

Wyjątki i kody błędów mają zasadniczo takie same scenariusze użycia z funkcjami, które zwracają coś i te, które nie.Expected<T>z drugiej strony wydaje się, że jest on ukierunkowany tylko na funkcje zwracające wartości.

Moje pytania to:

Czy któryś z was próbowałExpected<T> w praktyce?Jak zastosowałbyś ten idiom do funkcji, które nie zwracają niczego (czyli funkcji pustych)?

Aktualizacja:

Myślę, że powinienem wyjaśnić moje pytanie. TheExpected<void> specjalizacja ma sens, ale bardziej interesuje mnie, w jaki sposób zostanie ona użyta - spójny idiom użytkowania. Sama implementacja jest drugorzędna (i łatwa).

Na przykład Alexandrescu podaje ten przykład (nieco zmieniony):

string s = readline();
auto x = parseInt(s).get(); // throw on error
auto y = parseInt(s); // won’t throw
if (!y.valid()) {
    // ...
}

Ten kod jest „czysty” w taki sposób, że po prostu płynie naturalnie. Potrzebujemy wartości - dostajemy ją. Jednak zexpected<void> należałoby przechwycić zwróconą zmienną i wykonać na niej jakąś operację (np.throwIfError() lub coś), co nie jest tak eleganckie. I oczywiście.get() nie ma sensu z pustką.

Jak wyglądałby twój kod, powiedzmy, gdybyś miał inną funkcjętoUpper(s), który modyfikuje łańcuch w miejscu i nie ma wartości zwracanej?

questionAnswers(5)

yourAnswerToTheQuestion