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