¿Cómo puedo declarar una función que devuelve un std::optional lambda? p.ej
<what_do_i_put_here?> foo(bool b) { if(b) return std::nullopt; return [](int) { ... }; }¿Qué hay de usar el operador ternario? Deducirá automáticamente el tipo optional correcto
#include <optional> auto foo(bool b) { return b ? std::nullopt : std::optional{[](int){}}; }Puede agregar un nivel de direccionamiento indirecto para deducir el tipo a través de auto y decltype :
#include <optional> auto foo_impl(){ return [](int){}; } std::optional<decltype(foo_impl())> foo(bool b) { if(b) return std::nullopt; return foo_impl(); }Puedes hacerlo algo como lo siguiente
#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 ) )( ); } Otra forma es usar std::function con std::optional como por ejemplo
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; } ); } }