Tengo algunas dificultades con el reenvío perfecto.Reenvío perfecto y std :: tuple (u otra clase con plantilla)
Aquí es mi nivel actual de entendimiento: Plantilla de pegamento + referencia rvalue + std :: hacia adelante y un modo mágico especial en donde se activan reglas de deducción plantilla no tienen el mismo significado como de costumbre, pero se hacen a mano para permitir el reenvío perfecto. Ejemplo:
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
Pero, ¿qué ocurre si T es en realidad una clase de plantilla? Por ejemplo, ¿cómo puedo perfeccionar el reenvío de una std :: tuple? Si utilizo un T & & como aboce perderé toda la información de tipo de los objetos contenidos en la tupla. Sin embargo
el siguiente código no puede trabajar:
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
última instantánea gcc dice:
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
Así que, claramente, estamos todavía en el caso general, no molde donde lvalue No se puede enlazar para validar la referencia. "Modo forwading perfecto" no se activa
así que traté de ser astuto y pasar mi tupla como plantilla plantilla:
template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
Pero sigo teniendo el mismo error.
¿No puede simplemente llamar a std :: forward sin especificar el tipo (ya que es una función de plantilla y puede usar la deducción)? 'std :: forward (t)' – SoapBox