Esta pregunta es un seguimiento de How to deduce the type of the functor's return value? Lo estoy reformulando de una manera más abstracta.¿Forma genérica de deducir el tipo de devolución de un funtor?
Dado el pseudocódigo de una función de plantilla
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
donde <ret-expr>
es una expresión arbitraria que implica arg
, ¿qué puedo utilizar para <decl-expr>
para establecer el tipo de retorno de ComputeSomething
igual al tipo de retorno de la funtor.
El functor puede ser una clase, un lambda o un puntero de función.
Soluciones parciales que encontré hasta ahora.
(a) La respuesta a mi pregunta vinculada realizada por ecatmur. Básicamente, está repitiendo la declaración de devolución en <decl-expr>
. Problemas: es propenso a errores y no funcionaría si contiene variables locales.
(b) Sólo funciona para los punteros de función
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
(c) Se supone que el argumento de la funtor es de tipo Arg
(que no pueden sostener en general) y requiere Arg
ser default- construible
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(d) Uso de std::declval
que se supone que levantar la restricción por defecto Urbanizable, como se sugiere en how to deduce the return type of a function in template. ¿Alguien podría explicar cómo funciona?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())
Siento decir esto, pero yo sepa esto no es posible, porque el retorno de arrastre no ve la plantilla de función está definida, mientras que el el cuerpo lo hace. –