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));
};