471,076 Members | 1,280 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,076 software developers and data experts.

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 1667

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

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.