Re: conversion of pointer-to-member to void*
Hi!
Pavel Minaev schrieb:
Because pointers-to-members are not plain pointers. Aside from the
fact that Standard says that it is so :) consider also how they might
be implemented for virtual methods, taking dynamic dispatch into
account.
Yeah.
Also, try printing out sizeof pointer-to-member type on your
implementation. You might be surprised to see what it says.
I did that already. The size is four on gcc-4.2.4 i686-pc-linux-gnu.
This article may also help understand the issues surrounding this:
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
Ok, quoting from the article: "According to the Standard (section
5.2.10/9), you can use reinterpret_cast to store a member function for
one class inside a member function pointer for an unrelated class."
So I can just use any specific pointer-to-member variable instead of a
void*.
Is there a common pointer type for all pointer-to-member pointers?
No.
Well, sort of. My solution is:
template<typename Class, typename Result>
struct MemberPointer
{
private:
typedef int MemberPointer::* AnyPointer;
public:
template<typename Member>
MemberPointer(Member Class::* member)
: function(&MemberPointer::template memberPointer<Member>)
, anyMember(reinterpret_cast<AnyPointer>(member))
{}
Result dereference(Class& c) const
{
return function(c, anyMember);
}
private:
Result (*function)(Class&, AnyPointer);
AnyPointer anyMember;
template<typename Member>
static Result memberPointer(Class& c, const AnyPointer anyMember)
{
typedef Member (Class::* MemberType);
const MemberType member =
reinterpret_cast<MemberType>(anyMember);
return static_cast<Result>(c.*member);
}
};
Thanks to all.
Frank
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]