运算符在C ++中的模板中重载

时间:2011-08-23 15:42:44

标签: c++ operator-overloading

我从某处读了以下代码:

template<class T> class A {
    T a;
public:
    A(T x):a(x) {}
    operator T() const {return a;}   // what is point here?
};


int _tmain(int argc, _TCHAR* argv[])
{
    A<int> a = A<int>(5);
    int n = a;
    cout << n;
    return 0;
}

下线是什么意思?

  

运算符T()const {return a;}

3 个答案:

答案 0 :(得分:4)

  

运算符T()const {return a;}

这是typecast operator。它会隐式地将类实例转换为T。在您发布的示例代码中,此转换正在

行执行
  

int n = a;

答案 1 :(得分:3)

这意味着如果您想将实例转换为T,您可以使用此运算符,此处返回私有成员的副本。

在您的示例代码中,您可以直接将a类型A<int>分配给int。尝试删除operator T()并查看无法编译的错误,并将A<T>指定给int时出错。

使用非explicit构造函数(与标记构造函数explicit相反),在许多情况下,这种类型的行为与模板类型本身非常相似。实际上,你已经将T包装在另一个类中,当需要时它就像T一样。你可以扩展它来做其他更有用的事情,比如监视/记录/限制真实实例的使用,将它们隐藏在控制它们的东西之后。

另请注意,由于隐式构造函数,您可以将A<int> a = A<int>(5);更改为A<int> a = 5;

答案 2 :(得分:-5)

它基本上是一个仿函数 - 这是一个具有函数语义的对象。这意味着你可以在一个函数中调用对象,就像你可能使用函数的地方一样 - 它是一个通用的编程概念。

这是有益的,因为你可以拥有该函数对象(仿函数)的多个实例,并且它们每个都可以维护自己的状态,就好像你有一个直接函数那么它只能通过静态变量来维护状态,并且它因此不会重入(你只得到一个静态变量的实例)。

在STL算法中大量使用Functors作为额外的可选参数。