Je joue autour de type déduction/impression en utilisant des modèles avec le code de la forme:déduction de type de modèle de référence
#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;
}
Je me demande si obtenir la dernière ligne ou non je peux pour revenir int&
, c'est-à-dire, soit:
(i) que le modèle de fonction print en déduit le type de son argument comme int&
ou en quelque sorte fonctionne il devrait renvoyer un printType<T&>
quand je le passe; ou
(ii) si cela est inévitable en raison de la façon dont la variable est transmise à la fonction. Y at-il des moyens de contourner cela en changeant la forme d'impression ou en utilisant une autre tricherie de gabarit? Si des solutions existent, je préférerais non-C++ 0x, mais il est toujours bon de voir quelles raccourcis seront, sinon déjà, disponibles dans le futur.
Je suggère qu'il triche ... voir ci-dessous. –