es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  ,

Answer

  1. Avatar for 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 usar std::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:

    “`
    template
    using hasmember2t =
    decltype(std::declval().member2(std::declval<Eigen::ArrayBase &&>()));

    static constexpr bool hasmember2 =
    std::experimental::is
    detectedconvertiblev;“`

Comments are closed.