如何 return 一个 std::optional lambda?

How to return an std::optional lambda?

如何声明一个 returns 一个 std::optional lambda 的函数?例如

<what_do_i_put_here?> foo(bool b) {
    if(b) return std::nullopt;
    return [](int) { ... };
}

您可以通过 autodecltype 添加一个间接级别来推断类型:

#include <optional>

auto foo_impl(){
    return [](int){};
}

std::optional<decltype(foo_impl())> foo(bool b) {
    if(b) return std::nullopt;
    return foo_impl();
}

你可以像下面那样做

#include <iostream>
#include <optional>

auto f( bool b )
{
    auto l = [] { std::cout << "Hello World!";  };
    std::optional<decltype( l )> opt;

    if (b)
    {
        // some code
        opt = l;
    }
    else
    {
        // some other cod
    }

    return opt;
}

int main()
{
    ( *f( true  ) )( );
}

另一种方法是将 std::functionstd::optional 一起使用,例如

std::optional<std::function<void( int )>> g( bool b )
{
    if (b)
    {
        return std::function<void( int )>( []( int x ) { std::cout << x;  } );
    }
    else
    {
        return std::function<void( int )>( []( int x ) { std::cout << 2 * x; } );
    }
}

使用三元运算符怎么样?它会自动推断出正确的 optional 类型

#include <optional>
auto foo(bool b) {
  return b ? std::nullopt : std::optional{[](int){}};
}

在即将发布的 C++23 中,您可以避免使用额外的函数,而只在需要时才构建您的 lambda。不幸的是,目前对此的支持是实验性的:

#include <optional>

auto foo(bool const b) {
    return (b ? std::optional<bool>(true) : std::optional<bool>())
      .transform([](bool){
          return [](int){ return 42;};
      });   
}

demo 带有 gcc 主干)

这使用了新的 std::optional<T>::transform(F) 成员函数。