Connecting Tech Pros Worldwide Forums | Help | Site Map

The dreaded question

caustik
Guest
 
Posts: n/a
#1: Jul 19 '05
I don't care if its bad C++, I really dont. I need to convert from
a member function pointer to a "void*" with zero computational
overhead.

I have the perfect way to do it right here, but i'm having troubles
because if the member function pointer i pass to the function is
not void with no params, I get a casting error.

Any ideas how to do this?

caustik

// ************************************************** ****************
// * Take THIS C++ !!
// ************************************************** ****************
template <class BaseClass> inline void *MFPtoFP( void
(BaseClass::*pMemFunc)(void) )
{
union
{
void BaseClass::*pMemFunc;
void *pFunc();
}
ThisConv;

ThisConv.pFunc = pMemFunc;

return ThisConv.pFunc;
}



Victor Bazarov
Guest
 
Posts: n/a
#2: Jul 19 '05

re: The dreaded question


"caustik" <caustik@nospam.com> wrote...[color=blue]
> I don't care if its bad C++, I really dont. I need to convert from
> a member function pointer to a "void*" with zero computational
> overhead.[/color]

A pointer to member cannot be converted to void*. Period. It's
not "bad C++", it's "not C++". Such conversion does not exist
in C++.
[color=blue]
> I have the perfect way to do it right here, but i'm having troubles[/color]

So, if you're "having troubles", how can it be "perfect"?
[color=blue]
> because if the member function pointer i pass to the function is
> not void with no params, I get a casting error.
>
> Any ideas how to do this?[/color]

There is no way.

Now, let me ask you a question. Why do you think you need that?
[color=blue]
>
> caustik
>
> // ************************************************** ****************
> // * Take THIS C++ !!
> // ************************************************** ****************
> template <class BaseClass> inline void *MFPtoFP( void
> (BaseClass::*pMemFunc)(void) )
> {
> union
> {
> void BaseClass::*pMemFunc;
> void *pFunc();[/color]

You could declare this as

void (*pFunc)();

but it's _not_ going to solve the conversion problem, trust me.
It will probably get rid of the "casting error", as you put it,
but it's not going to give the right answer.
[color=blue]
> }
> ThisConv;
>
> ThisConv.pFunc = pMemFunc;
>
> return ThisConv.pFunc;
> }
>
>[/color]

Victor


Cy Edmunds
Guest
 
Posts: n/a
#3: Jul 19 '05

re: The dreaded question


"caustik" <caustik@nospam.com> wrote in message
news:bdvl9r$cgp$1@eeyore.INS.cwru.edu...[color=blue]
> I don't care if its bad C++, I really dont.[/color]

Well, then, I don't care if it works. I really don't.

lol

See Victor's answer.

Cy


caustik
Guest
 
Posts: n/a
#4: Jul 19 '05

re: The dreaded question


[color=blue]
> A pointer to member cannot be converted to void*. Period. It's
> not "bad C++", it's "not C++". Such conversion does not exist
> in C++.[/color]

Damn, you know that I stated I dont care. There are tricks to do it,
and I dont give a flying crap if they arent technically legal.
[color=blue][color=green]
> > I have the perfect way to do it right here, but i'm having troubles[/color]
>
> So, if you're "having troubles", how can it be "perfect"?[/color]

Well, fool, the method is "perfect" because it works 100% of the time
in my program. I happen to know the system that my program is compiled
and executed on, so I can take advantages of facts about that system.

I suppose I am ignorant to dare to optimize my program.
[color=blue]
>[color=green]
> > because if the member function pointer i pass to the function is
> > not void with no params, I get a casting error.
> >
> > Any ideas how to do this?[/color]
>
> There is no way.[/color]

Bullshit, I did it already.
[color=blue]
>
> Now, let me ask you a question. Why do you think you need that?[/color]

Let me rephrase your question: Why do you [smart ass remark] need that?

The reason is that I have a massive array of generic pointers to functions,
and their respective "Wrapper" functions which are called when the binary
code for these intercepted functions is executed. The problem is that some
of these functions are "__thiscall", and the intercepted code must take this
into account.

Believe it or not, not everbody's C++ program can be efficient while obeying
every single anal object oriented design rule on the planet. I am
interfacing
with already-compiled C++ code, so it takes some "Hacks" to get it working
efficiently and without looking like utter garbage.

After several years of reading this newsgroup, I've noticed there is some
sort
of deep rooted psychological problem with some of you guys. You'd sooner
spend 30 minutes typing a lengthy "I'm above everybody" post to respond to
peoples slightly offtopic or anal-incomplatible questions, instead of
posting a
quick solution and saying "note that this is a hack". Its horrible.


caustik
Guest
 
Posts: n/a
#5: Jul 19 '05

re: The dreaded question


P.S. This works *Pefectly* (on my x86/win32 system, which is all i'm
targetting) :

// ************************************************** ****************
// * Take THIS C++ !!
// ************************************************** ****************
template <class BaseClass, typename MFT> inline void *MFPtoFP( MFT pMemFunc)
{
union
{
MFT pMemFunc;
void (*pFunc)();
}
ThisConv;

ThisConv.pMemFunc = pMemFunc;

return ThisConv.pFunc;
}


Andre Kostur
Guest
 
Posts: n/a
#6: Jul 19 '05

re: The dreaded question


"caustik" <caustik@nospam.com> wrote in
news:bdvnpi$hg8$1@eeyore.INS.cwru.edu:
[color=blue]
> P.S. This works *Pefectly* (on my x86/win32 system, which is all i'm
> targetting) :[/color]

Since you know your target platform, why don't you take your question over
to a newsgroup that caters to your target platform (and since you
apparently already know that it cannot be done in Standard C++)? I'd
suggest one of the newsgroups on Microsoft's news server probably being the
most topical.
Michael Furman
Guest
 
Posts: n/a
#7: Jul 19 '05

re: The dreaded question



"Howard Hinnant" <hinnant@metrowerks.com> wrote in message
news:020720031926481030%hinnant@metrowerks.com...[color=blue]
> In article <bdvl9r$cgp$1@eeyore.INS.cwru.edu>, caustik
> <caustik@nospam.com> wrote:
> [...]
> If you really want to do this, C++ offers a far easier route. You can
> convert anything to anything, with zero computational cost:
>
> #include <vector>
> #include <list>
> #include <string>
>
> template <class T, class U>
> inline
> T just_do_it(const U& u)
> {
> return *(T*)(&u);
> }
>
> int main()
> {
> std::vector<int> v =
> just_do_it<std::vector<int> >(std::list<std::string>());
> }
>
> ... not that I'm recommending it mind you. Here's the rope ...[/color]

I would recomment much more safe and effective solution to "convert"
anything
to void pointer:

#define convert_to_pointer(argument) ((void *)0)

regards,
Michael Furman




E. Robert Tisdale
Guest
 
Posts: n/a
#8: Jul 19 '05

re: The dreaded question


Something that calls itself caustik wrote:
[color=blue]
> I don't care if its bad C++, I really don't. I need to convert from
> a member function pointer to a "void*" with zero computational
> overhead.
>
> I have the perfect way to do it right here, but I'm having troubles
> because if the member function pointer i pass to the function is
> not void with no params, I get a casting error.
>
> Any ideas how to do this?
>
> caustik
>
> // ************************************************** ****************
> // * Take THIS C++ !!
> // ************************************************** ****************
> template <class BaseClass> inline void *MFPtoFP( void
> (BaseClass::*pMemFunc)(void) )
> {
> union
> {
> void BaseClass::*pMemFunc;
> void *pFunc();
> }
> ThisConv;
>
> ThisConv.pFunc = pMemFunc;
>
> return ThisConv.pFunc;
> }[/color]

This is an obvious troll. Please ignore it.

David White
Guest
 
Posts: n/a
#9: Jul 19 '05

re: The dreaded question


E. Robert Tisdale <E.Robert.Tisdale@jpl.nasa.gov> wrote in message
news:3F036A8C.3030306@jpl.nasa.gov...[color=blue]
> This is an obvious troll. Please ignore it.[/color]

I don't know if it's a troll or not, but it clearly wasn't obvious to all
those who answered the question.

Is it just the email address that makes it a troll?

Just wondering.

David



Jack Klein
Guest
 
Posts: n/a
#10: Jul 19 '05

re: The dreaded question


On Wed, 2 Jul 2003 15:48:37 -0700, "caustik" <caustik@nospam.com>
wrote in comp.lang.c++:
[color=blue]
>[color=green]
> > A pointer to member cannot be converted to void*. Period. It's
> > not "bad C++", it's "not C++". Such conversion does not exist
> > in C++.[/color]
>
> Damn, you know that I stated I dont care. There are tricks to do it,
> and I dont give a flying crap if they arent technically legal.
>[color=green][color=darkred]
> > > I have the perfect way to do it right here, but i'm having troubles[/color]
> >
> > So, if you're "having troubles", how can it be "perfect"?[/color]
>
> Well, fool, the method is "perfect" because it works 100% of the time
> in my program. I happen to know the system that my program is compiled
> and executed on, so I can take advantages of facts about that system.[/color]

If you know, and don't care, that's is not legal C++, and yet you post
it in comp.lang.c++ and display an insulting attitude to those who
tell you is it not legal C++, you are the one with the psychological
problem.

*PLONK*

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++ ftp://snurse-l.org/pub/acllc-c++/faq
E. Robert Tisdale
Guest
 
Posts: n/a
#11: Jul 19 '05

re: The dreaded question


David White wrote:
[color=blue]
> E. Robert Tisdale wrote:
>[color=green]
>>This is an obvious troll. Please ignore it.[/color]
>
> I don't know if it's a troll or not,
> but it clearly wasn't obvious to all those who answered the question.
>
> Is it just the email address that makes it a troll?
>
> Just wondering.[/color]

I was simply expressing my opinion.
I look for the typical signs:

1. a troll handle
caustik,
2. a forged or disposable email account
nospam.com,
3. an emotionally provocative subject
The dreaded question
4. the original poster does not participate in the discussion
(except, possibly, to abuse the respondents)

There is seldom a good reason why a legitimate post
to a technical newsgroup like comp.lang.c++
should evoke a strong emotional response in any subscriber.
If it does, you should suspect a troll.
Real people use real names and post from legitimate ISPs.
Trolls use handles and post from disposable email accounts
or just forge the the address so you can't trace them.
Be vigilant. Learn to recognize trolls
and don't respond to them.

Default User
Guest
 
Posts: n/a
#12: Jul 19 '05

re: The dreaded question




caustik wrote:[color=blue]
>[/color]
[color=blue]
> Damn, you know that I stated I dont care. There are tricks to do it,
> and I dont give a flying crap if they arent technically legal.[/color]


Yeah . . . I going to need you to go into my killfile. Yeah . . . move
all the way to the back. Thanks, that'll be great.




Brian Rodenborn
tom_usenet
Guest
 
Posts: n/a
#13: Jul 19 '05

re: The dreaded question


On Wed, 2 Jul 2003 15:11:09 -0700, "caustik" <caustik@nospam.com>
wrote:
[color=blue]
>I don't care if its bad C++, I really dont. I need to convert from
>a member function pointer to a "void*" with zero computational
>overhead.[/color]

sizeof memfunptr on VC++ can be 4, 8 or 12 (and possibly bigger?),
depending on the function and class in question. Size of void(*)() is
4. As you can see, a non-lossy conversion is impossible in general.
[color=blue]
>
>I have the perfect way to do it right here, but i'm having troubles
>because if the member function pointer i pass to the function is
>not void with no params, I get a casting error.[/color]

It isn't perfect even if you fix it - if the classes involved have
virtual base classes, or you use multiple inheritence, then you'll get
a crash. If they don't, you may be ok with your current version, but
it may of course start crashing next time you upgrade, or if you
switch to another compiler.

Tom
Alexander Terekhov
Guest
 
Posts: n/a
#14: Jul 19 '05

re: The dreaded question



caustik wrote:[color=blue]
>
> I don't care if its bad C++, I really dont.[/color]

Yeah. But it *might* not work even on "x86/win32 system", believe me.
[color=blue]
> I need to convert from
> a member function pointer to a "void*" with zero computational
> overhead.[/color]

Stay away from "void*".
[color=blue]
>
> I have the perfect way to do it right here, but i'm having troubles
> because if the member function pointer i pass to the function is
> not void with no params, I get a casting error.
>
> Any ideas how to do this?[/color]

Sure. http://groups.google.com/groups?selm...5B66D%40web.de

regards,
alexander.
Alexander Terekhov
Guest
 
Posts: n/a
#15: Jul 19 '05

re: The dreaded question



Default User wrote:
[...][color=blue]
> Yeah . . . I going to need you to go into my killfile. Yeah . . . move
> all the way to the back. Thanks, that'll be great.[/color]

I'm just curious: how BIG is your killfile? Well, I'm asking because
I'd be interested to buy a copy of it... if it's "big enough", so to
speak. ATTENTION: this "offer" is valid for all c.l.c++'s "plonkers"
from The United States (only) and will last until the end of The 226th
Independence Day (in all US time zones... uhmm, except Alaska, Hawaii,
and Samoa, sorry for that). Hurry up and act NOW! I need _only_one_
copy -- the BIGGEST one.

regards,
alexander.

P.S. Default, did you appreciate "the e-greetings" from Berlin City
Dump... did it arrive yet?
Phlip
Guest
 
Posts: n/a
#16: Jul 19 '05

re: The dreaded question


caustik wrote:
[color=blue]
> I don't care if its bad C++, I really dont. I need to convert from
> a member function pointer to a "void*" with zero computational
> overhead.[/color]

Why?

Answering why might lead us to a suggestion that's good for your code.

(BTW the answer is: put the member function pointer into a structure, take
the address of the structure, and cast away. Good luck not crashing.)

--
Phlip
http://www.c2.com/cgi/wiki?TestFirstUserInterfaces



Ron Natalie
Guest
 
Posts: n/a
#17: Jul 19 '05

re: The dreaded question



"caustik" <caustik@nospam.com> wrote in message news:bdvnpi$hg8$1@eeyore.INS.cwru.edu...[color=blue]
> P.S. This works *Pefectly* (on my x86/win32 system, which is all i'm
> targetting) :
>[/color]
How can it work perfectly? On VC++ the sizeof(MPT) is some where
between 2 and 4 times the sizeof (void*)?


Steve Coleman
Guest
 
Posts: n/a
#18: Jul 19 '05

re: The dreaded question


E. Robert Tisdale wrote:
[color=blue]
> I was simply expressing my opinion.
> I look for the typical signs:
>
> 1. a troll handle
> caustik,
> 2. a forged or disposable email account
> nospam.com,[/color]

Well, they can try to anyway... ;-)

NNTP-Posting-Host: sandiego.divxnetworks.com
X-Trace: eeyore.INS.cwru.edu 1057183867 12825
207.67.92.110 (2 Jul 2003 22:11:07 GMT)
X-Complaints-To: abuse@po.cwru.edu
NNTP-Posting-Date: 2 Jul 2003 22:11:07 GMT
NNTP-Posting-User: acr10@sandiego.divxnetworks.com

In answer to the actual question...

If performance is so much of an issue that it becomes socially
acceptable to insult those that might try to help (even before asking
the question), then what's wrong with just coding an ASM var push/pop or
register move and be done with it? *That* will convert most anything! ..
and also ignore all language usage restrictions (aka. protections) in
the process. IMHO one beauty in the C++ language is that it _has_ these
restrictions, and all for good reason! To prevent someone from abusing
the usage of known types in a manner which is undefined or incorrect.

On the other hand my glass is always half full, and given the latest
description of the problem from the original poster perhaps we should
discuss the correct manner to address his issues rather than getting so
wrapped up in the emotionally charged aspects of it. Do we have enough
to go on for a C++ design discussion here? Can anyone out there suggest
a *better solution*[tm] USING the C++ language instead of trying to
fight against it(e.g. unions of pointers)? I'm sure that others out
there who are learning C++ might benefit from a discussion of C++ design
rather than a food fight (lol).





Default User
Guest
 
Posts: n/a
#19: Jul 19 '05

re: The dreaded question




Alexander Terekhov wrote:[color=blue]
>
> Default User wrote:
> [...][color=green]
> > Yeah . . . I going to need you to go into my killfile. Yeah . . . move
> > all the way to the back. Thanks, that'll be great.[/color]
>
> I'm just curious: how BIG is your killfile?[/color]

Don't worry Al, there's a place for you if you really need it.



Brian Rodenborn
Default User
Guest
 
Posts: n/a
#20: Jul 19 '05

re: The dreaded question




"E. Robert Tisdale" wrote:
[color=blue]
> There is seldom a good reason why a legitimate post
> to a technical newsgroup like comp.lang.c++
> should evoke a strong emotional response in any subscriber.
> If it does, you should suspect a troll.[/color]


Well, I feel that way about many of your posts, especially on
comp.lang.c.




Brian Rodenborn
Alexander Terekhov
Guest
 
Posts: n/a
#21: Jul 19 '05

re: The dreaded question



Default User wrote:[color=blue]
>
> Alexander Terekhov wrote:[color=green]
> >
> > Default User wrote:
> > [...][color=darkred]
> > > Yeah . . . I going to need you to go into my killfile. Yeah . . . move
> > > all the way to the back. Thanks, that'll be great.[/color]
> >
> > I'm just curious: how BIG is your killfile?[/color]
>
> Don't worry Al, there's a place for you if you really need it.[/color]

For free?

regards,
alexander.
Jeff Rosenfeld
Guest
 
Posts: n/a
#22: Jul 19 '05

re: The dreaded question


template <class T> inline void* MFPtoFP (T p) { return
reinterpret_cast<void*>(p); }

or maybe even do away with type-foo like so:

#define MFPtoFP(p) reinterpret_cast<void*>(p)

or some such variant seems to be what you want. Just make sure only to
instantiate it with pointer types. You could be losing information, though,
because pointers to member functions (or even to normal functions) can be
larger than pointers to data.

- Jeff.

"caustik" <caustik@nospam.com> wrote in message
news:bdvl9r$cgp$1@eeyore.INS.cwru.edu...[color=blue]
> I don't care if its bad C++, I really dont. I need to convert from
> a member function pointer to a "void*" with zero computational
> overhead.
>
> I have the perfect way to do it right here, but i'm having troubles
> because if the member function pointer i pass to the function is
> not void with no params, I get a casting error.
>
> Any ideas how to do this?
>
> caustik
>
> // ************************************************** ****************
> // * Take THIS C++ !!
> // ************************************************** ****************
> template <class BaseClass> inline void *MFPtoFP( void
> (BaseClass::*pMemFunc)(void) )
> {
> union
> {
> void BaseClass::*pMemFunc;
> void *pFunc();
> }
> ThisConv;
>
> ThisConv.pFunc = pMemFunc;
>
> return ThisConv.pFunc;
> }
>
>[/color]


Alexander Terekhov
Guest
 
Posts: n/a
#23: Jul 19 '05

re: The dreaded question



Default User wrote:[color=blue]
>
> Alexander Terekhov wrote:[color=green]
> >
> > Default User wrote:[/color]
>[color=green][color=darkred]
> > > Don't worry Al, there's a place for you if you really need it.[/color]
> >
> > For free?[/color]
>
> I didn't charge you for the cheese, did I?[/color]

Cheese? I had to pay for garbage recycling.

regards,
alexander.
Mike Wahler
Guest
 
Posts: n/a
#24: Jul 19 '05

re: The dreaded question



E. Robert Tisdale <E.Robert.Tisdale@jpl.nasa.gov> wrote in message
news:3F036A8C.3030306@jpl.nasa.gov...[color=blue]
> Something that calls itself caustik wrote:
>[color=green]
> > I don't care if its bad C++, I really don't. I need to convert from
> > a member function pointer to a "void*" with zero computational
> > overhead.
> >[/color][/color]

[color=blue][color=green]
> > I have the perfect way to do it[/color][/color]
^^^^^

right here, but I'm having troubles
^^^^^^^
[color=blue][color=green]
> > because if the member function pointer i pass to the function is
> > not void with no params, I get a casting error.[/color][/color]

Then is your way really 'perfect' after all?
[color=blue][color=green]
> >
> > Any ideas how to do this?[/color][/color]

How about your 'perfect' way?

-Mike



Alexander Terekhov
Guest
 
Posts: n/a
#25: Jul 19 '05

re: The dreaded question



Mike Wahler wrote: [...]

Whaler, you did it much better last year. Gee, that was fun...
can we do this again?

http://google.com/groups?selm=ag217d...mindspring.net

**********
Just a quick note to wish all my American friends and
acquaintances here a happy, safe Independence Day.

Between the festivites, fireworks, backyard barbeques, etc.,,
please take a moment to acknowledge the extraordinary integrity,
courage, and achievements of those who risked and gave their
lives so long ago in order to enable us to live as free people.

And to those of you from other various places around
the globe, a pleasant day and a happy, prosperous life
to you as well.

It's an honor and a pleasure to know and interact with
all of you.

-Mike

"I have never been able to conceive how any rational being could
propose happiness to himself from the exercise of power over
others." --Thomas Jefferson to A. L. C. Destutt de Tracy, 1811
**********

regards,
alexander.

P.S. Go and celebrate, chap. Don't waste your time here.
Default User
Guest
 
Posts: n/a
#26: Jul 19 '05

re: The dreaded question




Alexander Terekhov wrote:[color=blue]
>
> Default User wrote:[/color]
[color=blue][color=green]
> > I didn't charge you for the cheese, did I?[/color]
>
> Cheese? I had to pay for garbage recycling.[/color]


What?! That was the finest genetically engineered Merican cheese food
substitute. All you had to do was unwrap it and place it on the ground,
it would have dissolved a tunnel straight down at least 500 feet (that's
like 29657.222 kizzometrics or whatever weird measurements you use over
there). No disposal costs were required at all.

You don't know much about cheese.




Brian Rodenborn
Alexander Terekhov
Guest
 
Posts: n/a
#27: Jul 19 '05

re: The dreaded question



Default User wrote:[color=blue]
>
> Alexander Terekhov wrote:[color=green]
> >
> > Default User wrote:[/color]
>[color=green][color=darkred]
> > > I didn't charge you for the cheese, did I?[/color]
> >
> > Cheese? I had to pay for garbage recycling.[/color]
>
> What?! That was the finest genetically engineered Merican cheese food
> substitute. All you had to do was unwrap it and place it on the ground,
> it would have dissolved a tunnel straight down at least 500 feet (that's
> like 29657.222 kizzometrics or whatever weird measurements you use over
> there). No disposal costs were required at all.
>
> You don't know much about cheese.[/color]

I don't pretend to know much about it. I've just heard that
cheese was invented by a wandering slave who was carrying
milk across the Great American Desert in a saddlebag made
from an Alligator's stomach. American product.

regards,
alexander.
JustBoo@BooHoo.gone
Guest
 
Posts: n/a
#28: Jul 19 '05

re: The dreaded question


On Mon, 7 Jul 2003 16:29:01 -0400, "Marduk"
<guill.lmNOSPAM@sympatico.ca> wrote:
[color=blue]
>Yup, the same guy invented fire in the early 1920's[/color]

Al Gore was alive and walking then?



-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
-----== Over 80,000 Newsgroups - 16 Different Servers! =-----
Bren
Guest
 
Posts: n/a
#29: Jul 19 '05

re: The dreaded question


>>Yup, the same guy invented fire in the early 1920's[color=blue]
>
>Al Gore was alive and walking then?[/color]

Oh yah. But these days he's just walking.


-----= Posted via Newsfeeds.Com, Uncensored Usenet News =-----
http://www.newsfeeds.com - The #1 Newsgroup Service in the World!
-----== Over 80,000 Newsgroups - 16 Different Servers! =-----
Closed Thread