Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::optional::transform(3)   C++ Standard Libary  std::optional::transform(3)

NAME
       std::optional::transform	- std::optional::transform

Synopsis
	  template< class F >			     (1) (since	C++23)
	  constexpr auto transform( F&&	f ) &;
	  template< class F >			     (2) (since	C++23)
	  constexpr auto transform( F&&	f ) const&;
	  template< class F >			     (3) (since	C++23)
	  constexpr auto transform( F&&	f ) &&;
	  template< class F >			     (4) (since	C++23)
	  constexpr auto transform( F&&	f ) const&&;

	  If  *this contains a value, invokes f	with the contained value as an
       argument, and
	  returns an std::optional that	contains the result  of	 that  invoca-
       tion; otherwise,
	  returns an empty std::optional.

	  The  type of contained value in the result (denoted by U below) must
       be a non-array
	  object type, and must	not  be	 std::in_place_t  or  std::nullopt_t).
       Otherwise, the
	  program is ill-formed.

	  1)  Let U be std::remove_cv_t<std::invoke_result_t<F,	T&>>. If *this
       contains	a
	  value, returns a std::optional<U> whose contained value  is  direct-
       initialized from
	  std::invoke(std::forward<F>(f),  **this)  (unlike  and_then(), which
       must return an
	  std::optional	 directly).  Otherwise,	 returns  an  empty   std::op-
       tional<U>.
	  The program is ill-formed if the variable definition U
	  x(std::invoke(std::forward<F>(f), **this)); is ill-formed.
	  2)  Same  as	(1), except that U is std::remove_cv_t<std::invoke_re-
       sult_t<F, const
	  T&>>.
	  3) Let U be std::remove_cv_t<std::invoke_result_t<F, T>>.  If	 *this
       contains	a value,
	  returns  a std::optional<U> whose contained value is direct-initial-
       ized from
	  std::invoke(std::forward<F>(f), std::move(**this)).  Otherwise,  re-
       turns an	empty
	  std::optional<U>.
	  The program is ill-formed if the variable definition U
	  x(std::invoke(std::forward<F>(f),   std::move(**this)));   is	  ill-
       formed.
	  4) Same as (3), except that  U  is  std::remove_cv_t<std::invoke_re-
       sult_t<F, const T>>.

Parameters
	  f  - a suitable function or Callable object whose call signature re-
       turns a
	      non-reference type

Return value
	  An std::optional containing the result of f  or  an  empty  std::op-
       tional, as described
	  above.

Notes
	  Because  transform directly constructs a U object at the right loca-
       tion, rather than
	  passing it to	a constructor, std::is_move_constructible_v<U> can  be
       false.

	  As  the  callable  f	can't  return a	reference type,	it cannot be a
       pointer to data
	  member.

	  Some languages call this operation map.

	  Feature-test macro  Value    Std		   Feature
	  __cpp_lib_optional 202110L (C++23) Monadic  operations  in  std::op-
       tional

Example
       // Run this code

	#include <iostream>
	#include <optional>

	struct A { /* ... */ };
	struct B { /* ... */ };
	struct C { /* ... */ };
	struct D { /* ... */ };

	auto A_to_B(A) -> B { /* ... */	std::cout << "A	=> B \n"; return {}; }
	auto B_to_C(B) -> C { /* ... */	std::cout << "B	=> C \n"; return {}; }
	auto C_to_D(C) -> D { /* ... */	std::cout << "C	=> D \n"; return {}; }

	void try_transform_A_to_D(std::optional<A> o_A)
	{
	    std::cout << (o_A ?	"o_A has a value\n" : "o_A is empty\n");

	    std::optional<D> o_D = o_A.transform(A_to_B)
				      .transform(B_to_C)
				      .transform(C_to_D);

	    std::cout << (o_D ?	"o_D has a value\n\n" :	"o_D is	empty\n\n");
	};

	int main()
	{
	    try_transform_A_to_D( A{} );
	    try_transform_A_to_D( {} );
	}

Output:
	o_A has	a value
	A => B
	B => C
	C => D
	o_D has	a value

	o_A is empty
	o_D is empty

See also
	  value_or  returns  the  contained  value if available, another value
       otherwise
		   (public member function)
	  and_then returns the result of the given function on	the  contained
       value if	it
	  (C++23)  exists, or an empty optional	otherwise
		   (public member function)
	  or_else   returns the	optional itself	if it contains a value,	or the
       result of the
	  (C++23)  given function otherwise
		   (public member function)

http://cppreference.com		  2024.06.10	   std::optional::transform(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::optional::transform&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help