• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <tuple>

    std::apply

    namespace std {
      template<class F, class Tuple>
      constexpr decltype(auto)
        apply(F&& f, Tuple&& t);                     // (1) C++20
    
      template<class F, tuple-like Tuple>
      constexpr decltype(auto)
        apply(F&& f, Tuple&& t) noexcept(see below); // (1) C++23
    }
    

    概要

    タプルを展開し、関数の引数に適用してその関数を実行する。

    要件

    適用先の関数はCallable要件を満たす(INVOKE操作が可能)。展開されるTuple型はstd::tupleに限定されず、std::arrayまたはstd::pairのように、std::getstd::tuple_sizeをサポートする型であればよい。(C++20 まで。)C++23 ではtuple-likeによる制約が追加されたため、使用できる型は狭まった。(tuple-like参照)

    効果

    次のような関数があるとき、

    // C++17
    template<class F, class Tuple, 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))...);
    }
    
    // C++23
    template<class F, tuple-like Tuple, 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))...);
    }
    

    C++17 : 次と等価である。

    return apply-impl(std::forward<F>(f), std::forward<Tuple>(t),
                      std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>{});
    

    C++20 : 次と等価である。

    戻り値

    適用した関数呼び出しの戻り値

    例外

    C++23から : Iをパラメータパック0, 1, ..., (tuple_size_v<remove_reference_t<Tuple>>-1)としたとき、例外指定の式は次と等価 : noexcept(invoke(std::forward<F>(f), get<I>(std::forward<Tuple>(t))...))

    #include <iostream>
    #include <tuple>
    #include <string>
    
    void f(int a, double b, std::string c)
    {
      std::cout << a << std::endl;
      std::cout << b << std::endl;
      std::cout << c << std::endl;
    }
    
    int main()
    {
      std::tuple<int, double, std::string> args(1, 3.14, "hello");
      std::apply(f, args);
    }
    

    出力

    1
    3.14
    hello
    

    バージョン

    言語

    • C++17

    処理系

    関連項目

    参照