名前空間
変種
操作

std::apply

From cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
ヘッダ <tuple> で定義
template< class F, class Tuple >
constexpr decltype(auto) apply( F&& f, Tuple&& t );
(C++17以降)
(C++23まで)
template< class F, tuple-like Tuple >
constexpr decltype(auto) apply( F&& f, Tuple&& t ) noexcept(/* see below */);
(C++23から)

t の要素を引数として、Callable オブジェクト f を呼び出します。

以下のように定義された、説明のみの関数 apply-impl を考慮すると、

template<class F,class Tuple, std::size_t... I>
constexpr decltype(auto)
    apply-impl(F&& f, Tuple&& t, std::index_sequence<I...>) // 説明のみ
{
    return INVOKE(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}

効果は以下と同等です

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

目次

[編集] パラメータ

f - 呼び出される Callable オブジェクト
t - f の引数として使用される要素を持つタプル

[編集] 戻り値

f によって返される値。

[編集] 例外

(なし)

(C++23まで)
noexcept 指定:  
noexcept(

    noexcept(std::invoke(std::forward<F>(f),
                         std::get<Is>(std::forward<Tuple>(t))...))

)

ここで Is...パック を示します

(C++23から)

[編集] 備考

Tuplestd::tuple である必要はなく、代わりに std::getstd::tuple_size をサポートするものなら何でも使用できます。特に、std::arraystd::pair も使用できます。

(C++23まで)

Tuple はタプルライクに制約されます。つまり、その中の各型は std::tuple の特殊化、または tuple-like をモデル化する別の型 (std::arraystd::pair など) である必要があります。

(C++23から)
機能テストマクロ 規格 機能
__cpp_lib_apply 201603L (C++17) std::apply

[編集]

#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; };
 
template<typename... Ts>
std::ostream& operator<<(std::ostream& os, std::tuple<Ts...> const& theTuple)
{
    std::apply
    (
        [&os](Ts const&... tupleArgs)
        {
            os << '[';
            std::size_t n{0};
            ((os << tupleArgs << (++n != sizeof...(Ts) ? ", " : "")), ...);
            os << ']';
        }, theTuple
    );
    return os;
}
 
int main()
{
    // OK
    std::cout << std::apply(add, std::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::pair(2.0f, 3.0f)) << '\n'; 
 
    // advanced example
    std::tuple myTuple{25, "Hello", 9.31f, 'c'};
    std::cout << myTuple << '\n';
}

出力

3
5
[25, Hello, 9.31, c]

[編集] 関連項目

引数型によって定義された型の tuple オブジェクトを生成する
(関数テンプレート) [編集]
転送参照tuple を生成する
(関数テンプレート) [編集]
引数のタプルを使ってオブジェクトを構築する
(関数テンプレート) [編集]
(C++17)(C++23)
任意の呼び出し可能 (Callable)オブジェクトを所与の引数で呼び出す (戻り値の型を指定することも可能)(C++23以降)
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)