¿Puede detectar un miembro de plantilla de una clase utilizando std::is_detected?
Utilizo std::experimental::is_detected para determinar si una clase tiene ciertas funciones miembro:
include <utility>
include <experimental type_traits="">
template<typename usc="">
class Descriptor
{
private:
template<class T>
using has_member1_t =
decltype(std::declval<T>().member1(std::declval<std::vector<char> &>()));
public:
static constexpr bool has_member1 =
std::experimental::is_detected_convertible_v<long long,
has_member1_t,
USC>;
};
El problema es que también necesito determinar si una clase tiene cierta ***función miembro de plantilla*** con la siguiente firma:
template<typename derived="">
int member2(Eigen::ArrayBase<derived> &&)
He intentado hacerlo de esta manera:
// Dento de Descriptor
template<class t,="" class="" u="">
using hasmember2t =
decltype(std::declval<t>().member2(std::declval<><u> &&>()));
static constexpr bool hasmember2 =
std::experimental::isdetectedconvertiblev<long long,="" hasmember2t,="" usc="">;
pero no funciona. Como no tengo mucha experiencia con TMP de C++, me gustaría saber si hay alguna forma de lograr esto con std::experimental::is_detected u otra utilidad.
davy.ai
Puede utilizar
std::experimental::is_detected
para determinar si una clase tiene ciertas funciones miembro de plantilla. Para hacer esto, necesita crear un alias de tipo de plantilla que tome dos parámetros de plantilla, uno para la clase y otro para el tipo del parámetro de plantilla de la función miembro. Luego, puede usarstd::experimental::is_detected_convertible_v
para verificar si existe la función miembro.Por ejemplo, para verificar si una clase tiene una función miembro de plantilla con la firma
template int member2 (Eigen::ArrayBase &&)
, puede usar el siguiente código:“`().member2(std::declval<Eigen::ArrayBase &&>()));
template
using hasmember2t =
decltype(std::declval
static constexpr bool hasmember2 =;“`
std::experimental::isdetectedconvertiblev