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