Connecting Tech Pros Worldwide Forums | Help | Site Map

Question on usage of functional object.

hn.ft.pris@gmail.com
Guest
 
Posts: n/a
#1: Jan 23 '07
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 Tclass 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<intvec(10, 1);

Sum<intsum;

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!


Kai-Uwe Bux
Guest
 
Posts: n/a
#2: Jan 23 '07

re: Question on usage of functional object.


hn.ft.pris@gmail.com wrote:
Quote:
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 Tclass 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<intvec(10, 1);
>
Sum<intsum;
>
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.
Quote:
On the other hand, Sum<int doesn't work.
Right: Sum<intjust denotes a type. It is not an expression that evaluates
to an object of that type.
Quote:
(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.
Quote:
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
Tushar Saxena
Guest
 
Posts: n/a
#3: Jan 23 '07

re: Question on usage of functional object.


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?=
Guest
 
Posts: n/a
#4: Jan 23 '07

re: Question on usage of functional object.


On Jan 23, 1:25 pm, Tushar Saxena <tsax...@cse.buffalo.eduwrote:
Quote:
Hello everyone,
Hi, try to start a new topic next time and don't hijack an existing
one.
Quote:
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<Tinstead.

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

The rest is the same.

--
Erik Wikström

Closed Thread