# std::apply

From cppreference.com
< cpp‎ | utility

Defined in header `<tuple>` |  |
template <class F, class Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t); |  | (since C++17)

Invoke the Callable object `f` with a tuple of arguments.

### Parameters

f | - | Callable object to be invoked
t | - | tuple whose elements to be used as arguments to `f`

### Return value

The value returned by `f`.

### Notes

The tuple need not be std::tuple, and instead may be anything that supports std::get and std::tuple_size; in particular, std::array and std::pair may be used.

### Possible implementation

    namespace detail {
    template <class F, class Tuple, std::size_t... I>
    constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
    {
        return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
    }
    }  // namespace detail

    template <class F, class Tuple>
    constexpr decltype(auto) apply(F&& f, Tuple&& t)
    {
        return detail::apply_impl(
            std::forward<F>(f), std::forward<Tuple>(t),
            std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{});
    }

### Example

Run this code

    #include <iostream>
    #include <tuple>
    #include <utility>

    int add(int first, int second) { return first + second; }

    template<typename T>
    T add_generic(T first, T second) { return first + second; }

    auto add_lambda = [](auto first, auto second) { return first + second; };

    int main()
    {
        // OK
        std::cout << std::apply(add, std::make_pair(1, 2)) << '\n';

       // Error: can't deduce the function type
       // std::cout << std::apply(add_generic, std::make_pair(2.0f, 3.0f)) << '\n';

       // OK
       std::cout << std::apply(add_lambda, std::make_pair(2.0f, 3.0f)) << '\n';
    }

Output:

    3
    5

### See also

make_tuple | creates a `tuple` object of the type defined by the argument types (function template)
forward_as_tuple | creates a `tuple` of rvalue references (function template)
make_from_tuple (C++17) | Construct an object with a tuple of arguments (function template)
invoke (C++17) | invokes any Callable object with given arguments (function template)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/apply&oldid=106891"