Tengo el siguiente fragmento de código, como un ejemplo dec_proxy intenta revertir los efectos del operador de incremento sobre el tipo que se ejecuta en una llamada de función compleja foo - que por cierto no puedo cambiar la interfaz de.Pasando temporarios como referencias no-const en C++
#include <iostream>
template<typename T>
class dec_proxy
{
public:
dec_proxy(T& t)
:t_(t)
{}
dec_proxy<T>& operator++()
{
--t_;
return *this;
}
private:
T& t_;
};
template<typename T, typename S, typename R>
void foo(T& t, S& s, R& r)
{
++t;
++s;
++r;
}
int main()
{
int i = 0;
double j = 0;
short k = 0;
dec_proxy<int> dp1(i);
dec_proxy<double> dp2(j);
dec_proxy<short> dp3(k);
foo(dp1,dp2,dp3);
//foo(dec_proxy<int>(i), <---- Gives an error
// dec_proxy<double>(j), <---- Gives an error
// dec_proxy<short>(k)); <---- Gives an error
std::cout << "i=" << i << std::endl;
return 0;
}
El problema es que para los distintos tipos que me gustaría utilizar dec_proxy que actualmente requieren la creación de una instancia especializada de dec_proxy - parece un enfoque muy desordenado y limitado.
Mi pregunta es: ¿Cuál es la forma correcta de pasar tales temporarios efímeros como parámetros de referencia no constantes?
¿Por qué no pasa el objeto por valor? –
Porque así es como se ha definido foo, no puedo cambiar foo y porque foo toma múltiples parámetros. –
En ese caso, excelente pregunta. –