我从某处读了以下代码:
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;}
答案 0 :(得分:4)
答案 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作为额外的可选参数。