我一直在使用具有以下形式代码的模板来进行类型推导/打印:
#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) 让函数模板 print 将其参数的类型推导为int&
或者以某种方式计算出它应该返回一个printType<T&>
当我经过它时;或者
(ii) 由于变量传递给函数的方式,这是否是不可避免的。
有没有办法通过改变打印形式或使用其他模板技巧来解决这个问题?如果存在解决方案,我更喜欢非 C++0x,但总是很高兴看到将来有哪些捷径(如果还没有)可用。
没有办法解决这个问题。一种表达p
, where p
命名引用,始终具有引用所引用的类型。没有任何表达式具有类型T&
。因此您无法检测表达式是否源自引用。
这也不能用 C++0x 来完成。 C++ 的一个深刻原则是不存在具有引用类型的表达式。你can write decltype(r)
得到什么的类型r
名称而不是表达式的类型r
有。但你将无法写print(r)
, 除非print
当然是一个宏,但我不明白为什么你会走那条可怕的路。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)