microsoft/Terminal
Vedi su GitHub`til::coalesce<T>` should be able to take a function that returns `T`
Open
#15.940 aperta il 7 set 2023
Area-CodeHealthHelp WantedIssue-TaskProduct-Meta
Metriche repository
- Star
- (35.764 star)
- Metriche merge PR
- (Merge medio 27g 19h) (24 PR mergiate in 30 g)
Descrizione
From a teams chat
example 1
int Foo() {...}
optional<int> whatever { /*...*/ };
...
int a = til::coalese(whatever, Foo)
Foo only gets called if whatever is empty.
example 2
class Foo{
optional<int> _cached;
int GetThing();
int _generate();
}
int Foo::GetThing()
{
_cached = coalesce(_cached, [&](){ return _generate(); });
return _cached;
}
int Foo::_generate() { /*...*/ }
Look ma, now it's easy to implement lazy properties. So easy in fact...
example 3 - til::lazy_property<T>
class Foo {
til::lazy_property<int> Thing { { this, &Foo::_generate } }; // same syntax as winrt event handlers
int _generate();
}
// ...
Foo foo{};
int x = foo.Thing(); // Calls _generate
int y = foo.Thing(); // Doesn't
foo.Thing.invalidate();
int z = foo.Thing(); // calls generate again
(maybe we don't do this one. Seems like it's potentially footgun-y)
This is a truly one of the ideas I had while working on Profile::EvaluatedIcon in #15843