Я играл вокруг с типом дедукции/печать с использованием шаблонов с кодом вида:Шаблон типа вывод ссылки
#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;
}
Я задаюсь вопросом, может ли я получить последнюю строчку вернуть int&
, то есть либо:
(i) печать шаблона функции выводит тип аргумента как int&
или как-то получается, он должен вернуть printType<T&>
, когда я передаю его r; или
(ii) является ли это неизбежным из-за способа передачи переменной функции.
Есть ли способы обойти это, изменив форму печати или используя какой-либо другой шаблонный обман? Если решения существуют, я бы предпочел не-C++ 0x, но всегда хорошо видеть, какие короткие сокращения, если они еще не будут, доступны в будущем.
Я предлагаю ему ChEaTs ... смотри ниже. –