Me gustaría escribir una función de plantilla que acepte 2 valores y un funtor o una lambda. La función llama al funtor con esos valores y devuelve el resultado.¿Cómo deducir el tipo de valor de retorno del funtor?
template <typename T, typename Fn>
_ReturnTypeOfPred_ Apply(T x, T y, Fn fn)
{
return fn(x, y);
}
Pregunta: ¿Cómo puedo definir el tipo de retorno de Apply
para convertirse igual al tipo de retorno de Fn
? No es necesariamente igual a T
, como en este ejemplo del funtor
template <typename T>
auto Sum(T x, T y) -> decltype(x+y)
{
return x+y;
}
actualización
fue demasiado simplificado El primero ejemplo. ¿Debería funcionar esta?
template <typename TContainer, typename Fn>
auto Apply(const TContainer& x, const TContainer& y, Fn fn) -> decltype(fn(x.front(), y.front()))
{
return fn(x.front(), y.front());
}
¿Sería siempre funciona si repito return
expresión en decltype
del tipo de cambio? ¿Hay una manera más elegante?
Los nombres de los encabezados de línea están reservados para la implementación. No debe usarlos en su propio código. –
@KerrekSB: Era un marcador de posición, no un código real – Andrey
Los buenos funtores (como los que están en el STL) siempre definen su 'return_type', por lo que podría usar' Fn :: return_type'. Pero entiendo que quieres una respuesta que también funcione para functors no tan buenos. – Gorpik