is_invocable、is_invocable_r、is_nothrow_invocable、is_nothrow_invocable_r クラス

これらのテンプレートは、指定された引数の型を使用して型を呼び出すことができるかどうかを決定します。 is_invocable_ris_nothrow_invocable_r も、呼び出しの結果が特定の型に変換可能かどうかを判断します。 is_nothrow_invocableis_nothrow_invocable_r も、呼び出しで例外がスローされないと知られているかどうかを判断します。 C++17 で追加されました。

構文

template <class Callable, class... Args>
struct is_invocable;

template <class Convertible, class Callable, class... Args>
struct is_invocable_r;

template <class Callable, class... Args>
struct is_nothrow_invocable;

template <class Convertible, class Callable, class... Args>
struct is_nothrow_invocable_r;

// Helper templates
template <class Callable, class... Args>
inline constexpr bool is_invocable_v =
    std::is_invocable<Callable, Args...>::value;

template <class Convertible, class Callable, class... Args>
inline constexpr bool is_invocable_r_v =
    std::is_invocable_r<Convertible, Callable, Args...>::value;

template <class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_v =
    std::is_nothrow_invocable<Callable, Args...>::value;

template <class Convertible, class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_r_v =
    std::is_nothrow_invocable_r<Convertible, Callable, Args...>::value;

パラメーター

呼び出し
照会する呼び出し可能型。

Args
照会する引数の型。

オープンカー
Callable の結果が変換可能である必要がある型。

解説

呼び出し可能な型 Callable を、評価されていないコンテキストで引数 Args を使用して呼び出すことができる場合、is_invocable 型の述語は true を保持します。

呼び出し可能な型 Callable を、Convertible に変換可能な結果の型を生成するために、評価されていないコンテキストで引数 Args を使用して呼び出すことができる場合、is_invocable_r 型の述語は true を保持します。

呼び出し可能な型 Callable を、評価されていないコンテキストで引数 Args を使用して呼び出すことができ、そのような呼び出しが例外をスローしないことが知られている場合、is_nothrow_invocable 型の述語は true を保持します。

呼び出し可能な型 Callable を、Convertible に変換可能な結果の型を生成するために、評価されていないコンテキストで引数 Args を使用して呼び出すことができ、そのような呼び出しが例外をスローしないことが知られている場合、is_nothrow_invocable_r 型の述語は true を保持します。

Convertible 型、Callable 型、パラメーター パック Args 内の型は、それぞれ完全な型、不明なバインドの配列、または場合によっては cv-qualified void である必要があります。 それ以外の場合は、述語の動作は未定義になります。

// std__type_traits__is_invocable.cpp
// compile using: cl /EHsc /std:c++17 std__type_traits__is_invocable.cpp
#include <type_traits>

auto test1(int) noexcept -> int (*)()
{
    return nullptr;
}

auto test2(int) -> int (*)()
{
    return nullptr;
}

int main()
{
    static_assert( std::is_invocable<decltype(test1), short>::value );

    static_assert( std::is_invocable_r<int(*)(), decltype(test1), int>::value );
    static_assert( std::is_invocable_r<long(*)(), decltype(test1), int>::value ); // fails

    static_assert( std::is_nothrow_invocable<decltype(test1), int>::value );
    static_assert( std::is_nothrow_invocable<decltype(test2), int>::value ); // fails

    static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test1), int>::value );
    static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test2), int>::value ); // fails
}

要件

ヘッダー: <type_traits>

名前空間: std

関連項目

<type_traits>
invoke