472,807 Members | 1,750 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

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

pointer to any member function of any class

Subject: pointer to any member function of any class.

The "C++ FAQ Lite" explains how to hand a pointer to a member function
to a signal handler etc, but only to a static function (33.2), to
a fixed class (33.2), any member of a fixed class (33.6), to a fixed
function of any object (functiods, 33.10).

What I wanted was to be able to hand any member function of any
created object to a signal hander etc.

The code below achieves this, using functiods and templates. The code
compiles cleanly with "g++ -Wall -pedantic" (g++ 4.0 & 4.1), haven't
tried other compilers.

#include <iostream>
using namespace std;

//The base-class of the functiod:
class callbase{
public:
virtual ~callbase(){};
virtual int operator() (int i)=0; //Change/add arguments to taste
};

template<class classtocall>
class calltemplate:public callbase{
classtocall &object;
int (classtocall::*methodtocall)(int);
public:
calltemplate(classtocall &o,int (classtocall::*m)(int))
: object(o){
methodtocall=m;
}
int operator()(int i){ //Change/add arguments to taste
return (object.*methodtocall)(i);
}
};

//the signal handler, system call that starts a thread, etc:
class handler {
callbase *m;
public:
handler(callbase *b):m(b){};
int h(int i){
return (*m)(i); //Change/add arguments to taste
}
};

// A class whose memebers we want to pass to a signal handler etc.
class worker {
int i; //data member, just to show each instance is different
public:
worker(int j):i(j){}
int callme(int j){ //Change/add arguments to taste
return j*i;
}
int pleasecall(int j){
return j+i;
}
};

//need a typedef for each class whose members we want to be called
typedef calltemplate<workercall_worker;

int main (){
worker w1(3);
worker w2(7);
handler h1(new call_worker(w1, &worker::pleasecall));
handler h2(new call_worker(w2, &worker::callme));

callbase *members[]={
new call_worker(w1, &worker::callme),
new call_worker(w2, &worker::pleasecall)};
cout<<"h1 met arg 4="<<h1.h(4)<<endl;
cout<<"h2 met arg 4="<<h2.h(4)<<endl;
cout<<"arraymember: "<<(*members[0])(3)<<endl;;
cout<<"arraymember: "<<(*members[1])(3)<<endl;;
}

Jul 9 '06 #1
6 1884
jo******@gmail.com wrote:
Subject: pointer to any member function of any class.

The "C++ FAQ Lite" explains how to hand a pointer to a member function
to a signal handler etc, but only to a static function (33.2), to
a fixed class (33.2), any member of a fixed class (33.6), to a fixed
function of any object (functiods, 33.10).

What I wanted was to be able to hand any member function of any
created object to a signal hander etc.

The code below achieves this, using functiods and templates. The code
compiles cleanly with "g++ -Wall -pedantic" (g++ 4.0 & 4.1), haven't
tried other compilers.

#include <iostream>
using namespace std;

//The base-class of the functiod:
class callbase{
public:
virtual ~callbase(){};
virtual int operator() (int i)=0; //Change/add arguments to taste
};

template<class classtocall>
class calltemplate:public callbase{
classtocall &object;
int (classtocall::*methodtocall)(int);
public:
calltemplate(classtocall &o,int (classtocall::*m)(int))
: object(o){
methodtocall=m;
}
int operator()(int i){ //Change/add arguments to taste
return (object.*methodtocall)(i);
}
};

//the signal handler, system call that starts a thread, etc:
class handler {
callbase *m;
public:
handler(callbase *b):m(b){};
int h(int i){
return (*m)(i); //Change/add arguments to taste
}
};

// A class whose memebers we want to pass to a signal handler etc.
class worker {
int i; //data member, just to show each instance is different
public:
worker(int j):i(j){}
int callme(int j){ //Change/add arguments to taste
return j*i;
}
int pleasecall(int j){
return j+i;
}
};

//need a typedef for each class whose members we want to be called
typedef calltemplate<workercall_worker;

int main (){
worker w1(3);
worker w2(7);
handler h1(new call_worker(w1, &worker::pleasecall));
handler h2(new call_worker(w2, &worker::callme));

callbase *members[]={
new call_worker(w1, &worker::callme),
new call_worker(w2, &worker::pleasecall)};
cout<<"h1 met arg 4="<<h1.h(4)<<endl;
cout<<"h2 met arg 4="<<h2.h(4)<<endl;
cout<<"arraymember: "<<(*members[0])(3)<<endl;;
cout<<"arraymember: "<<(*members[1])(3)<<endl;;
}
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jul 10 '06 #2
jo******@gmail.com wrote:
Subject: pointer to any member function of any class.

The "C++ FAQ Lite" explains how to hand a pointer to a member function
to a signal handler etc, but only to a static function (33.2), to
a fixed class (33.2), any member of a fixed class (33.6), to a fixed
function of any object (functiods, 33.10).

What I wanted was to be able to hand any member function of any
created object to a signal hander etc.

The code below achieves this, using functiods and templates. The code
compiles cleanly with "g++ -Wall -pedantic" (g++ 4.0 & 4.1), haven't
tried other compilers.

#include <iostream>
using namespace std;

//The base-class of the functiod:
class callbase{
public:
virtual ~callbase(){};
virtual int operator() (int i)=0; //Change/add arguments to taste
};

template<class classtocall>
class calltemplate:public callbase{
classtocall &object;
int (classtocall::*methodtocall)(int);
public:
calltemplate(classtocall &o,int (classtocall::*m)(int))
: object(o){
methodtocall=m;
}
int operator()(int i){ //Change/add arguments to taste
return (object.*methodtocall)(i);
}
};

//the signal handler, system call that starts a thread, etc:
class handler {
callbase *m;
public:
handler(callbase *b):m(b){};
int h(int i){
return (*m)(i); //Change/add arguments to taste
}
};

// A class whose memebers we want to pass to a signal handler etc.
class worker {
int i; //data member, just to show each instance is different
public:
worker(int j):i(j){}
int callme(int j){ //Change/add arguments to taste
return j*i;
}
int pleasecall(int j){
return j+i;
}
};

//need a typedef for each class whose members we want to be called
typedef calltemplate<workercall_worker;

int main (){
worker w1(3);
worker w2(7);
handler h1(new call_worker(w1, &worker::pleasecall));
handler h2(new call_worker(w2, &worker::callme));

callbase *members[]={
new call_worker(w1, &worker::callme),
new call_worker(w2, &worker::pleasecall)};
cout<<"h1 met arg 4="<<h1.h(4)<<endl;
cout<<"h2 met arg 4="<<h2.h(4)<<endl;
cout<<"arraymember: "<<(*members[0])(3)<<endl;;
cout<<"arraymember: "<<(*members[1])(3)<<endl;;
}
My question would be, how does this accomplish "handing" *any* member
function of *any* class to a signal handler? I don't see any *signal*
handler, nor do I see any variation in the member functions. They
all take a single 'int' argument, they all return 'int', and they are
all non-cosnt. That's pretty far from "any" in my book.

Of course, it's possible that my terminology is simply different from
yours.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jul 10 '06 #3
Victor Bazarov wrote:
jo******@gmail.com wrote:
My question would be, how does this accomplish "handing" *any* member
function of *any* class to a signal handler? I don't see any *signal*
handler, nor do I see any variation in the member functions. They
all take a single 'int' argument, they all return 'int', and they are
all non-cosnt. That's pretty far from "any" in my book
True. On the other hand, it's rather difficult to excect to be able to
call both a func(char*) and a func(int), as in that that would make the
say signal handler that calls the function rather difficult.

When the signal handler receives event X, it has information YZ to hand
to the to-be-called-function -- the types of YZ do not depend on the
to-be-called-function.

Anyway, all useful examples I can think of are with a
function-to-be-called with fixed arguments and return-type.

Can you think of a situation where functions accepting any argument
types (and even return types) can be useful?

--
Thanks,
joostje

Jul 11 '06 #4
jo******@gmail.com wrote:
[..]
Can you think of a situation where functions accepting any argument
types (and even return types) can be useful?
Very rarely. Interpreters come to mind.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jul 11 '06 #5
Victor Bazarov wrote:
jo******@gmail.com wrote:
[..]
Can you think of a situation where functions accepting any argument
types (and even return types) can be useful?

Very rarely. Interpreters come to mind.
Ah, true. But in that case I suppose the function will be called with
something like a pointer to the "class arguments" (supplying any number
of arguments&types), and will return something similar.

(Rather close to what I do in the real code I use, actually).

Still, the example I show gives a lot more flexibility than any of the
examples in the C++ faq lite I found at
http://www.parashift.com/c++-faq-lit...o-members.html

Jul 11 '06 #6

<jo******@gmail.comwrote in message
news:11**********************@p79g2000cwp.googlegr oups.com...
Victor Bazarov wrote:
>jo******@gmail.com wrote:
Can you think of a situation where functions accepting any argument
types (and even return types) can be useful?
void ReportValue( const std::string Key, AnyType Value )
{
std::stringstream ReportStream;
ReportStream << CurrentTime << " Key:" << Key << " Value is:" << Value;
WriteReportString( ReportStream.str() );
}

AnyType GetFieldValue( const std::string Key )
{
std::string Value = GetValueFromDB( Key );
TypeEnum ValueType = GetTypeFromDB( Key );
switch TypeEnum
{
case IntType:
return StrmConvert<int>( Value );
case BoolType:
if ( Value == "TRUE" )
return true;
else
return false;
case...
}
Jul 12 '06 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Newsgroup - Ann | last post by:
Gurus, I have the following implementation of a member function: class A { // ... virtual double func(double v); void caller(int i, int j, double (* callee)(double)); void foo() {caller(1,...
37
by: Ben | last post by:
Hi, there. Recently I was working on a problem where we want to save generic closures in a data structure (a vector). The closure should work for any data type and any method with pre-defined...
15
by: Albert | last post by:
Hi, I need to pass a pointer-to-member-function as a parameter to a function which takes pointer-to-function as an argument. Is there any way to do it besides overloading the function? Here...
7
by: jon wayne | last post by:
Hi I'm a little confused here about the lifetime of a static pointer to member function, Say, I declare,define & initialize a static ptr to mem function in the header file of a class(the class...
6
by: keepyourstupidspam | last post by:
Hi, I want to pass a function pointer that is a class member. This is the fn I want to pass the function pointer into: int Scheduler::Add(const unsigned long timeout, void* pFunction, void*...
12
by: WaterWalk | last post by:
Hello. I am rather confused by the type of a pointer to class data member. Many c++ texts say that pointer to data member has a special syntax. For example the following class: class MyClass {...
7
by: WaterWalk | last post by:
Hello. I thought I understood member function pointers, but in fact I don't. Consider the following example: class Base { public: virtual ~Base() {} }; class Derived : public Base {
5
by: Tim Frink | last post by:
Hi, I'm experimenting with function pointers and found two questions. Let's assume this code: 1 #include <iostream> 2 class A; 3 4 //////////////////////////////////////////// 5 class B
5
by: Immortal Nephi | last post by:
I would like to design an object using class. How can this class contain 10 member functions. Put 10 member functions into member function pointer array. One member function uses switch to call...
7
by: ghulands | last post by:
I am having trouble implementing some function pointer stuff in c++ An object can register itself for many events void addEventListener(CFObject *target, CFEventHandler callback, uint8_t...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
linyimin
by: linyimin | last post by:
Spring Startup Analyzer generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it. Support for...
0
by: erikbower65 | last post by:
Here's a concise step-by-step guide for manually installing IntelliJ IDEA: 1. Download: Visit the official JetBrains website and download the IntelliJ IDEA Community or Ultimate edition based on...
0
by: Taofi | last post by:
I try to insert a new record but the error message says the number of query names and destination fields are not the same This are my field names ID, Budgeted, Actual, Status and Differences ...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth

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.