microsoft/Terminal

`til::coalesce<T>` should be able to take a function that returns `T`

開放

#15,940 建立於 2023年9月7日

 (1 則留言) (0 個反應) (0 位負責人)C++ (9,275 個分叉)batch import
Area-CodeHealthHelp WantedIssue-TaskProduct-Meta

倉庫指標

星標
 (103,173 顆星)
PR 合併指標
 (平均合併 27天 19小時) (30 天內合併 24 個 PR)

描述

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

貢獻者指南