He estado jugando con el tipo de deducción/impresión con el uso de plantillas de código del formulario:plantilla del tipo de la deducción de referencia
#include <iostream>
template <typename T>
class printType {};
template <typename T>
std::ostream& operator<<(std::ostream& os, const printType<T>&)
{
os << "SomeType"; return os;
}
template <typename T>
std::ostream& operator<<(std::ostream& os, const printType<T*>&)
{
os << printType<T>() << "*"; return os;
}
template <typename T>
std::ostream& operator<<(std::ostream& os, const printType<T&>&)
{
os << printType<T>() << "&"; return os;
}
// etc... and can call on a variable through
template <typename T>
printType<T> print(T) { return printType<T>(); }
int main()
{
int a = 7;
int *p = &a;
int &r = a;
//OK: return SomeType*
std::cout << "type of p: " << print(p) << std::endl;
//Hmmmm: returns SomeType <- (no &: can I get around this?)
std::cout << "type of r: " << print(r) << std::endl;
}
Me pregunto si o no puedo conseguir la última línea para volver int&
, es decir, ya sea:
(i) haga que la plantilla de impresión imprima deduciendo el tipo de su argumento como int&
o de alguna manera funcionó debería devolver un printType<T&>
cuando lo paso r; o
(ii) si esto es inevitable debido a la forma en que se pasa la variable a la función.
¿Hay alguna forma de evitar esto cambiando la forma de impresión o utilizando algún otro truco de plantilla? Si existen soluciones, preferiría no usar C++ 0x, pero siempre es bueno ver qué accesos directos estarán disponibles, si no, en el futuro.
Sugiero hace trampas ... ver más abajo. –