468,456 Members | 1,719 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,456 developers. It's quick & easy.

templated function as parameter of another templated function

I have a bunch of templated functions:

template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

and a wrapper function, also templated, which I want to take f2 and
f3 as arguments:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}
Then,

void some_function(){
double x=5, y=0;

y=foobar<double,f2>(x);
cout << y << endl;

y=foobar<double,f3>(x);
cout << y << endl;
}

works just fine.

The problem is what happens when all these are members of a class:
class A
{
public:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}


template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

void some_function(){
double x=5, y=0;

y=foobar<double,A::f2>(x);
cout << y << endl;

y=foobar<double,A::f3>(x);
cout << y << endl;
}
};
This doesn't compile. With g++-4.0.2 I get these errors:

g++ -g -Wall -o templtemplfunc templtemplfunc.C
templtemplfunc.C: In member function 'void A::some_function()':
templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)'
templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'

Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()?
Is what I want to do possible in the first place?

Thanks!

Jul 4 '06 #1
2 1591

Amadeus W. M. wrote:
I have a bunch of templated functions:

template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

and a wrapper function, also templated, which I want to take f2 and
f3 as arguments:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}
Then,

void some_function(){
double x=5, y=0;

y=foobar<double,f2>(x);
cout << y << endl;

y=foobar<double,f3>(x);
cout << y << endl;
}

works just fine.

The problem is what happens when all these are members of a class:
class A
{
public:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}


template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

void some_function(){
double x=5, y=0;

y=foobar<double,A::f2>(x);
cout << y << endl;

y=foobar<double,A::f3>(x);
cout << y << endl;
}
};
This doesn't compile. With g++-4.0.2 I get these errors:

g++ -g -Wall -o templtemplfunc templtemplfunc.C
templtemplfunc.C: In member function 'void A::some_function()':
templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)'
templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'

Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()?
Is what I want to do possible in the first place?

Thanks!
Member functions wouuldnt work in that manner because member functions
have an inherent "this" paramter and therefore the function signatures
are different from a regular function.

So, you can either make the member function as static and pass the
object as a parameter or else use mem_fn adaptor.

Jul 4 '06 #2
On Tue, 04 Jul 2006 12:41:00 -0700, amparikh wrote:
>
Amadeus W. M. wrote:
>I have a bunch of templated functions:

template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

and a wrapper function, also templated, which I want to take f2 and
f3 as arguments:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}
Then,

void some_function(){
double x=5, y=0;

y=foobar<double,f2>(x);
cout << y << endl;

y=foobar<double,f3>(x);
cout << y << endl;
}

works just fine.

The problem is what happens when all these are members of a class:
class A
{
public:

template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;

// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // over-simplification here.

// main computation.
y=f(z);

return y;
}


template <class Type_t>
double f2(Type_t x) { return 2*x; }

template <class Type_t>
double f3(Type_t x) { return 3*x; }

void some_function(){
double x=5, y=0;

y=foobar<double,A::f2>(x);
cout << y << endl;

y=foobar<double,A::f3>(x);
cout << y << endl;
}
};
This doesn't compile. With g++-4.0.2 I get these errors:

g++ -g -Wall -o templtemplfunc templtemplfunc.C
templtemplfunc.C: In member function 'void A::some_function()':
templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)'
templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'

Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()?
Is what I want to do possible in the first place?

Thanks!

Member functions wouuldnt work in that manner because member functions
have an inherent "this" paramter and therefore the function signatures
are different from a regular function.
I found that out too. A member function must have an object to be
called upon. To call a member without an object, the member must be static.
So, you can either make the member function as static and pass the
object as a parameter or else use mem_fn adaptor.
I made the f2 and f3 functions in the above example static members, and
all is well, without passing an object as parameter.

Thanks!

Jul 4 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Rich | last post: by
2 posts views Thread by Alex Drummond | last post: by
2 posts views Thread by Pete C | last post: by
2 posts views Thread by Olaf | last post: by
1 post views Thread by subhajit12345 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.