Question on usage of functional object.

H

hn.ft.pris

I've got following code test C++'s functor. For the sake of
easy-reading, I omit some declearations.



#include <algorithm>
#include <functional>

using namespace std;

template <typename T> class Sum{
public:
Sum(T i=0):sum(i){};
inline void operator () (T x){
sum += x;
}
inline T output() const{
return sum;
}

private:
T sum;
};

int main( void ){


vector<int> vec(10, 1);

Sum<int> sum;

sum = for_each(vec.begin(), vec.end(), Sum<int>()); .......(1)
sum = for_each(vec.begin(), vec.end(), sum); .........(2)
sum = for_each(vec.begin(), vec.end(), sum.operator()(int) ); ...(3)

cout << sum.output() << endl;

return 1;
}

It's easy to understand that (2) works, because sum.operator()(int) is
called implicitly. (1) also works, it confuses me. Does Sum<int>()
create an implicit class Sum object? On the other hand, Sum<int>
doesn't work.
(3) fails, does it means the third argument of "for_each" couldn't be a
function pointer? What will the code be if I want to pass a function
pointer here? Thanks for help!
 
K

Kai-Uwe Bux

I've got following code test C++'s functor. For the sake of
easy-reading, I omit some declearations.



#include <algorithm>
#include <functional>

using namespace std;

template <typename T> class Sum{
public:
Sum(T i=0):sum(i){};
inline void operator () (T x){
sum += x;
}
inline T output() const{
return sum;
}

private:
T sum;
};

int main( void ){


vector<int> vec(10, 1);

Sum<int> sum;

sum = for_each(vec.begin(), vec.end(), Sum<int>()); .......(1)
sum = for_each(vec.begin(), vec.end(), sum); .........(2)
sum = for_each(vec.begin(), vec.end(), sum.operator()(int) ); ...(3)

cout << sum.output() << endl;

return 1;
}

It's easy to understand that (2) works, because sum.operator()(int) is
called implicitly. (1) also works, it confuses me. Does Sum<int>()
create an implicit class Sum object?

There is nothing implicit about the function object. Although: it is a
temporary.
On the other hand, Sum<int> doesn't work.

(3) fails, does it means the third argument of "for_each" couldn't be a
function pointer?

No, it just means you got the syntax wrong.
What will the code be if I want to pass a function pointer here?

Well, just pass a function pointer. Something like:

void inc_5 ( int & a ) { a+=5; }

....

for_each( vec.begin(), vec.end(), &inc_5 );

(warning, I just typed it into the newsreader, so there may be typos in the
code.)

Best

Kai-Uwe Bux
 
T

Tushar Saxena

Hello everyone,

I'd really appreciate it if anyone could describe some of the nuances
of declaring and using a dynamic 2D array on the heap.


Thanx
<tuShaRsAXEna>
 
?

=?iso-8859-1?q?Erik_Wikstr=F6m?=

Hello everyone,

Hi, try to start a new topic next time and don't hijack an existing
one.
I'd really appreciate it if anyone could describe some of the nuances
of declaring and using a dynamic 2D array on the heap.

T* arr = new T[nr];

Replace T with the type you want an array of and nr with the number of
elements in the array.

arr[n]

Access element n of the array.

delete[] arr;

Delete the array when you are done with it.

Can't think of much more to say about it except that it might be better
to use std::vector<T> instead.

std::vector<T> arr = new std::vector<T>();
delete arr;

The rest is the same.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top