Bagikan melalui


kelas is_invocable, is_invocable_r, is_nothrow_invocable, is_nothrow_invocable_r

Templat ini menentukan apakah jenis dapat dipanggil dengan jenis argumen yang ditentukan. is_invocable_r dan is_nothrow_invocable_r juga menentukan apakah hasil pemanggilan dapat dikonversi ke jenis tertentu. is_nothrow_invocable dan is_nothrow_invocable_r juga menentukan apakah pemanggilan diketahui tidak melemparkan pengecualian. Ditambahkan di C++17.

Sintaks

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;

Parameter

Callable
Jenis yang dapat dipanggil untuk dikueri.

Args
Jenis argumen yang akan dikueri.

Convertible
Jenis hasil yang dapat dipanggil harus dapat dikonversi.

Keterangan

is_invocable Predikat jenis memegang true jika jenis yang dapat dipanggil Dapat Dipanggil dapat dipanggil menggunakan argumen Args dalam konteks yang tidak dievaluasi.

is_invocable_r Predikat jenis memegang true jika jenis yang dapat dipanggil Dapat Dipanggil dapat dipanggil menggunakan argumen Args dalam konteks yang tidak dievaluasi untuk menghasilkan jenis hasil yang dapat dikonversi ke Convertible.

is_nothrow_invocable Predikat jenis memegang true jika jenis yang dapat dipanggil Dapat Dipanggil dapat dipanggil menggunakan argumen Args dalam konteks yang tidak dievaluasi, dan bahwa panggilan seperti itu diketahui tidak melemparkan pengecualian.

is_nothrow_invocable_r Predikat jenis memegang true jika jenis yang dapat dipanggil Dapat Dipanggil dapat dipanggil menggunakan argumen Args dalam konteks yang tidak dievaluasi untuk menghasilkan jenis hasil yang dapat dikonversi ke Convertible, dan bahwa panggilan seperti itu diketahui tidak melemparkan pengecualian.

Masing-masing jenis Convertible, Callable, dan jenis dalam paket parameter Args harus berupa jenis lengkap, array yang tidak diketahui, atau mungkin cv-qualified void. Jika tidak, perilaku predikat tidak ditentukan.

Contoh

// 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
}

Persyaratan

Header:<type_traits>

Namespace: std

Lihat juga

<type_traits>
Memohon