Namespaces
Variants

std:: apply

From cppreference.net
Utilities library
ヘッダーで定義 <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 ( /* 下記参照 */ ) ;
(C++23以降)

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

以下のように定義される説明専用関数 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以降)

注記

Tuple は必ずしも std::tuple である必要はなく、 std::get std::tuple_size をサポートするものであれば何でも使用できる。特に、 std::array std::pair が使用可能である。

(C++23まで)

Tuple はtuple-likeに制約され、すなわち、その中の各型は std::tuple の特殊化、または tuple-like をモデル化する他の型( std::array std::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';
    // エラー: 関数型を推論できません
    // 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'; 
    // 高度な例
    std::tuple myTuple{25, "Hello", 9.31f, 'c'};
    std::cout << myTuple << '\n';
}

出力:

3
5
[25, Hello, 9.31, c]

関連項目

(C++11)
引数の型によって定義される型の tuple オブジェクトを作成する
(関数テンプレート)
転送参照 tuple を作成する
(関数テンプレート)
引数のタプルでオブジェクトを構築する
(関数テンプレート)
(C++17) (C++23)
任意の Callable オブジェクトを指定された引数で呼び出す (戻り値の型を指定可能) (C++23以降)
(関数テンプレート)