dimanche 5 avril 2015

are member pointers fixed in size and reinterpret_cast?

I am trying to create a template class that contains a pointer to an arbitrary class instance and function as follows:



template<class C>
class A {
typedef void (C::*FunctPtr)(); //e.g. void C::some_funct();

FunctPtr functPtr_;
C* instPtr_;
public:
A(FunctPtr functPtr, C* instPtr)
: functPtr_(functPtr)
, instPtr_(instPtr) {}
};


However, I want to be able to create instances of this class without dynamic memory allocation using placement new. Does the C++ standard guarantee this template class is of fixed size for all classes C?


In Don Clugston's article on pointers I noticed a chart of the various sizes for member functions pointers on various compilers and a few compilers aren't always the same size. I thought I was hosed but is this standards compliant? From the C++ standard sec. 5.2.10 on Reinterpret cast:


— converting a prvalue of type “pointer to member function” to a different pointer to member function type and back to its original type yields the original pointer to member value.


Would that statement from the C++ standard indicate member function pointers are all of the same size?


If not I suppose I could still rewrite the code as follows to take advantage of that reinterpret_cast guarantee explicitly:



class GenericClass;

template<class C>
class A {

typedef void (GenericClass::*GenFunctPtr)();
typedef void (C::*SpecificFunctPtr)();

GenFunctPtr functPtr_; //store any kind of function ptr in this fixed format
GenericClass* instPtr_;

public:
A(SpecificFunctPtr functPtr, C* instPtr)
: functPtr_(reinterpret_cast<GenFunctPtr>(functPtr))
, instPtr_(reinterpret_cast<GenericClass*>(instPtr)) {}

void DoSomething()
{
//now convert pointers back to the original type to use...
reinterpret_cast<SpecificFunctPtr>(functPtr_);
reinterpret_cast<C*>(instPtr_);
}
};


This now would seem to be required to be all the same size and yet be standards compliant, right? I'd prefer the first option however if I must the 2nd will also work. Thoughts?


Aucun commentaire:

Enregistrer un commentaire