这个运算符重载函数重载是什么?
What is this operator overloading function overloading?
我正在查看 CMBC 源代码并发现了这个代码片段:
void goto_symext::operator()(const goto_functionst &goto_functions)
{
goto_functionst::function_mapt::const_iterator it=
goto_functions.function_map.find(goto_functionst::entry_point());
if(it==goto_functions.function_map.end())
throw "the program has no entry point";
const goto_programt &body=it->second.body;
operator()(goto_functions, body);
}
我以前从未见过 operator()(args)
语法,谷歌搜索似乎没有任何结果。
如评论中所述,/*return type*/ operator()(/*params*/)
是重载 ()
运算符的语法。
struct Foo { void operator()() { std::cout << "Hello, world!"; } };
Foo f;
f(); //Hello, world!
这就是函数调用运算符,它允许您创建类似函数的对象。
struct Functor {
bool operator()(int a, int b = 3);
};
bool Functor::operator()(int a, int b /* = 3 */) {
if ((a > (2 * b)) || (b > (2 * a))) {
return true;
} else {
return false;
}
}
// ...
Functor f;
bool b = f(5); // Calls f.operator()(5, 3).
bool c = f(3, 5);
它的好处是您可以将状态信息保存在类函数对象的字段中,并且如有必要,您可以在对象中隐藏运算符的重载版本,而不是将它们暴露在外。
class Functor {
int compareTo;
public:
Functor(int cT);
bool operator()(int a);
bool operator()(char c);
};
Functor::Functor(int cT) : compareTo(cT) { }
bool Functor::operator()(int a) {
if ((a > (2 * compareTo)) || (compareTo > (2 * a))) {
return true;
} else {
return false;
}
}
bool Functor::operator()(char c) { return false; }
它可以用来更容易地编写可以接受任何函数的代码,而不是依赖于函数指针。 [在这方面,当与模板一起使用时效果特别好。]
我正在查看 CMBC 源代码并发现了这个代码片段:
void goto_symext::operator()(const goto_functionst &goto_functions)
{
goto_functionst::function_mapt::const_iterator it=
goto_functions.function_map.find(goto_functionst::entry_point());
if(it==goto_functions.function_map.end())
throw "the program has no entry point";
const goto_programt &body=it->second.body;
operator()(goto_functions, body);
}
我以前从未见过 operator()(args)
语法,谷歌搜索似乎没有任何结果。
如评论中所述,/*return type*/ operator()(/*params*/)
是重载 ()
运算符的语法。
struct Foo { void operator()() { std::cout << "Hello, world!"; } };
Foo f;
f(); //Hello, world!
这就是函数调用运算符,它允许您创建类似函数的对象。
struct Functor {
bool operator()(int a, int b = 3);
};
bool Functor::operator()(int a, int b /* = 3 */) {
if ((a > (2 * b)) || (b > (2 * a))) {
return true;
} else {
return false;
}
}
// ...
Functor f;
bool b = f(5); // Calls f.operator()(5, 3).
bool c = f(3, 5);
它的好处是您可以将状态信息保存在类函数对象的字段中,并且如有必要,您可以在对象中隐藏运算符的重载版本,而不是将它们暴露在外。
class Functor {
int compareTo;
public:
Functor(int cT);
bool operator()(int a);
bool operator()(char c);
};
Functor::Functor(int cT) : compareTo(cT) { }
bool Functor::operator()(int a) {
if ((a > (2 * compareTo)) || (compareTo > (2 * a))) {
return true;
} else {
return false;
}
}
bool Functor::operator()(char c) { return false; }
它可以用来更容易地编写可以接受任何函数的代码,而不是依赖于函数指针。 [在这方面,当与模板一起使用时效果特别好。]