is_invocable, is_invocable_r, is_nothrow_invocable, is_nothrow_invocable_r (Clases)
Estas plantillas determinan si un tipo se puede invocar con los tipos de argumento especificados. is_invocable_r
e is_nothrow_invocable_r
también determinan si el resultado de la invocación se puede convertir en un tipo específico. is_nothrow_invocable
e is_nothrow_invocable_r
también determinan si se tiene constancia de que la invocación no produce excepciones. Se incluyó en C++17.
Sintaxis
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;
Parámetros
Accesible
El tipo que se puede llamar para la consulta.
Args
Tipos de argumento que se van a consultar.
Convertible
Tipo al que debe poder convertirse el resultado de Callable.
Comentarios
El predicado de tipo is_invocable
es true si el tipo al que se puede llamar (Callable) se puede invocar mediante los argumentos Args en un contexto no evaluado.
El predicado de tipo is_invocable_r
es true si el tipo al que se puede llamar (Callable) se puede invocar mediante los argumentos Args en un contexto no evaluado para generar un tipo de resultado que se puede convertir a Convertible.
El predicado de tipo is_nothrow_invocable
es true si el tipo al que se puede llamar (Callable) se puede invocar mediante los argumentos Args en un contexto no evaluado, y si se tiene constancia de que dicha invocación no produce excepciones.
El predicado de tipo is_nothrow_invocable_r
es true si el tipo al que se puede llamar (Callable) se puede invocar mediante los argumentos Args en un contexto no evaluado para generar un tipo de resultado que se puede convertir a Convertible, y si se tiene constancia de que dicha invocación no produce excepciones.
Cada uno de los tipos Convertible y Callable, así como los tipos del paquete de parámetros Args, deben ser un tipo completo, una matriz de límite desconocido o posiblemente un tipo cv-qualified void
. De lo contrario, el comportamiento del predicado no está definido.
Ejemplo
// 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
}
Requisitos
Encabezado:<type_traits>
Espacio de nombres: std