这似乎是一个愚蠢的问题,但我从未见过这样的事情!
int operator() (const std::string& s1, const std::string& s2) const
to me operator是一个const成员函数,它返回一个intger而且没有变量参数! 但需要两个const变量s1和s2?!?!我无法理解这一点!
class str_dist_ :
public std::binary_function<std::string, std::string, int> {
public:
int op() (const std::string& s1, const std::string& s2) const
{
if (s1 == s2)
return 0;
else if (s1.empty())
return std::max(s2.size()/2, 1u);
else if (s2.empty())
return std::max(s1.size()/2, 1u);
else
return min_edit_distance(s1, s2, zero_one_cost<char>(' '));
}
std::string empty() const { return std::string(); }
};
答案 0 :(得分:3)
operator()
部分表示str_dist_
类型的对象可以被“调用”,就像它是一个函数一样。 (const std::string& s1, const std::string& s2)
告诉我们实际的论点是什么。
例如,假设我们有一个对象str_dist_ obj;
和两个std::string
个对象,str1
和str2
。然后我们可以写这样的东西
int result = obj(str1, str2);
在封面下,前一行与
相同int result = obj.operator()(str1, str2);
请注意,第一组括号是成员函数operator()
的名称的一部分,而第二组实际上列出了参数。
如果您想了解更多信息,请查看Functors或Function Objects。这些是用于引用诸如str_dist_
个对象之类的术语,这些对象具有为其定义的operator()
。如果你谷歌中的任何一个术语,你肯定会找到很多信息。
答案 1 :(得分:2)
它是括号运算符(或“函数调用运算符”):
Foo x;
int n = x(12, 'a');
int m = x.operator()(12, 'a'); // equivalent
此处运算符声明为int Foo::operator()(int, char)
。
答案 2 :(得分:2)
它是“函数调用运算符”,它允许对象“作为函数”使用,即:
str_dist_ myObject;
cout<<myObject("A string", "Another string"); // calls operator()
前两个括号表示它是函数调用运算符(因为+
表示它是+
运算符等),然后是参数列表。
重载函数调用运算符的重点是创建functors (function objects),have several advantages超过普通函数。