-5

这是代码

#include <iostream>
template<typename T>
class IsReference {
   private:
     typedef char One;
     typedef struct { char a[2]; } Two;
     template<typename C> static One test(C*);
     template<typename C> static Two test(...);
   public:
     enum { val = sizeof(IsReference<T>::test<T>(0)) == 1 };
     enum {result = !val};

};

template < class T>
void foo(T t){
  std::cout<< IsReference<T>::result << "\n";
}

class C{
  public: int a;
};

int main(){
  C c1;
  C &c2 = c1;
  foo(c1);
  foo(c2);
}

输出0也是foo(c2)我不想要的。

在里面foo如何检查是否T是引用类型?我不想调用foofoo<C&>(c2)即我们不知道函数在哪种类型上被实例化。

4

3 回答 3

2

你不能。作为表达式,c2是类型的左值C,就像c1,所以在这两种情况下,参数相关的查找都会选择foo<C>

使用 Boost.TypeTraits可以获得相同的结果。

C++11 中可能有一些新的魔法可以提供帮助,但是 (a) 我对 C++11 的了解不够,无法回答,并且 (b) 你已经标记了 C++03 的问题。

于 2011-12-14T12:43:42.107 回答
0

对于已编辑的问题

我不想调用 foo ,因为foo<C&>(c2)我们不知道函数在哪种类型上被实例化

这是不可能的。因为,当将对象或引用传递给函数时,函数不知道它是对象还是引用。

这是一个提议的 C++11 解决方案(使用宏);

#define FOO(X) foo<decltype(X)>(X)

使用FOO代替foo

于 2011-12-14T10:31:02.453 回答
-1

我认为应该是

template<typename C> static One test(C&);

而不是One test(C*)

于 2011-12-14T10:28:51.457 回答