[exec.into.variant] # 33 Execution control library [[exec]](./#exec) ## 33.9 Senders [[exec.snd]](exec.snd#exec.into.variant) ### 33.9.12 Sender adaptors [[exec.adapt]](exec.adapt#exec.into.variant) #### 33.9.12.13 execution​::​into_variant [exec.into.variant] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4722) into_variant adapts a sender with multiple value completion signatures into a sender with just one value completion signature consisting of a variant of tuples[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4727) The name into_variant denotes a pipeable sender adaptor object[.](#2.sentence-1) For a subexpression sndr, let Sndr be decltype((sndr))[.](#2.sentence-2) If Sndr does not satisfy [sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]"),into_variant(sndr) is ill-formed[.](#2.sentence-3) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4733) Otherwise, the expression into_variant(sndr) is expression-equivalent to:transform_sender(*get-domain-early*(sndr), *make-sender*(into_variant, {}, sndr)) except that sndr is only evaluated once[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4741) The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities")) is specialized for into_variant as follows: [🔗](#lib:impls-for%3cinto_variant_t%3e) namespace std::execution {template<>struct *impls-for* : *default-impls* {static constexpr auto *get-state* = *see below*; static constexpr auto *complete* = *see below*; templatestatic consteval void *check-types*() {auto cs = get_completion_signatures<*child-type*, *FWD-ENV-T*(Env)...>(); *decay-copyable-result-datums*(cs); // see [[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities")}};} [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4762) The member *impls-for*​::​*get-state* is initialized with a callable object equivalent to the following lambda:[](Sndr&& sndr, Rcvr& rcvr) noexcept-> type_identity, *FWD-ENV-T*(env_of_t)>> {return {};} [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L4772) The member *impls-for*​::​*complete* is initialized with a callable object equivalent to the following lambda:[](auto, State, Rcvr& rcvr, Tag, Args&&... args) noexcept -> void {if constexpr ([same_as](concept.same#concept:same_as "18.4.2 Concept same_­as [concept.same]")) {using variant_type = typename State::type; *TRY-SET-VALUE*(rcvr, variant_type(*decayed-tuple*{std::forward(args)...})); } else { Tag()(std::move(rcvr), std::forward(args)...); }}