如何 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) { ... };
}
您可以通过 auto
和 decltype
添加一个间接级别来推断类型:
#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::function
与 std::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)
成员函数。
如何声明一个 returns 一个 std::optional
lambda 的函数?例如
<what_do_i_put_here?> foo(bool b) {
if(b) return std::nullopt;
return [](int) { ... };
}
您可以通过 auto
和 decltype
添加一个间接级别来推断类型:
#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::function
与 std::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)
成员函数。