ver textos teclado rapido para mecanografia mas mano lapicero gratis escribir ejercicios digitacion con computadora como aprender c++ types c++14 return-type-deduction

c++ - teclado - ejercicios de mecanografia textos



¿Cómo tipear el tipo de retorno de un método desde una clase de plantilla? (3)

Lo más cerca que tengo es

using mappedType = typename std::result_of<decltype(&Mapper::map)(Mapper const*, const int&)>::type;

Casi lo tienes.

Declarado automáticamente this puntero no es constante en los métodos de clase no constantes, por lo que su

decltype(&Mapper::map)(Mapper const*, const int&)

no coincide con ningún método en la clase Mapper . Elimine el calificador const del primer argumento y su solución result_of funcionará sin instancias y argumentos ficticios:

using mappedType = typename std::result_of< decltype(&Mapper::map)(Mapper /*no const here*/ *, const int&) >::type;

Tengo un Helper clase con plantilla que se parece a esto:

template< typename Mapper > class Helper { public: using mappedType = ... ; };

Necesitaría que mappedType sea ​​el tipo devuelto por el método map(const int&) en la clase Mapper . Dado un tipo válido para Mapper como el siguiente:

class DMapper { public: double map(const int& val){ ... } };

Helper<DMapper>::mappedType debe ser double . ¿Hay una manera de hacerlo sin crear una instancia de un Mapper ?

Lo más cercano que tengo es:

using mappedType = typename std::result_of< decltype(&Mapper::map)(Mapper const*, const int&) >::type;

Pero el type no está definido en este caso.

EDITAR:

Si puedo evitar usar un argumento ficticio para el int , eso sería aún mejor (en mi código concreto, el argumento no es tan simple).


Puede usar std::declval para usar funciones miembro en decltype sin crear una instancia:

using mappedType = decltype(std::declval<Mapper>().map(0));

std::declval puede usarse también para argumentos:

using mappedType = decltype(std::declval<Mapper>().map(std::declval<int>()));


Suponiendo que Mapper::map no es un método sobrecargado, su tipo de retorno se puede resolver automáticamente de la siguiente manera:

template< typename Mapper > class Helper { private: template<class R, class... T> static R resolveReturnType(R (Mapper::*)(T...)); template<class R, class... T> static R resolveReturnType(R (Mapper::*)(T...) const); public: using mappedType = decltype(resolveReturnType(&Mapper::map)); };