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;;
} 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 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
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 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
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
<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...
} This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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,...
|
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...
|
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...
|
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...
|
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*...
|
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
{...
|
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
{
|
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
|
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...
|
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...
|
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...
|
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...
|
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...
|
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
...
|
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...
|
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...
|
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=()=>{
|
by: lllomh |
last post by:
How does React native implement an English player?
|
by: Mushico |
last post by:
How to calculate date of retirement from date of birth
| |