What is the problem with this code ? this code is giving me lots of syntax errors. Also I would like to know why functors are used in C++.
class f
{
public:
int operator(int a) {return a;}
} obj;
int main()
{
cout << obj(0) << endl;
}
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
You’re missing an extra pair of parenthesis when declaring
operator(). The name of the function isoperator(), and it still needs the list of parameters after it. Thus it should look like:Function objects (a.k.a. functors) like this are typically used where you’d use a pointer to a function. However, they have the advantage that they can use inheritance and they encapsulate state as well. Often, well designed class or function templates will be able to use them almost interchangeably with function pointers. However, a good optimizer can typically produce better code when a template object is used.
For a fairly sophisticated example of how you might use function objects, have a look at expression templates.
Here’s a small, somewhat contrived example of how they can use inheritance:
In this case, we create a base class with the operator as a pure virtual function. Then we derive to concrete classes that implement it. Code such as
show_it()can then use any instance of a class derived from this base. While we could just have used a pointer to a function that takes an int and returns an int, this is more typesafe. Code that uses the function pointer would accept any such function pointer, whereas this way we can define a whole new hierarchy that maps an int to an int:but instances of this would not be interchangeable with instances of unary_int_func.
As for state, consider a running sum function:
Here, the instance of
running_sumkeeps track of the total. It will print out 1, 3, 6 and 10. Pointers to functions have no such way of keeping state between distinct invocations. SGI’s STL page on function objects has a similar example to my running sum one, but shows how you can easily apply it to a range of elements in a container.