pointer to members arithmetic
Hi to all,
to make it short: I'm trying to build a small class that I conditionally
include in some other class just for debugging purposes.
This class should register itself in a container on construction and
unregister on destruction. The point is that I would like to query
the **enclosing class** (just during debugging...) through the
container. (check the code, hope it's clearer than the explanation..)
:-)
I would like to know if the pointer arithmetics and castings I've used
may bring to "undefined behavior" according to the standard.
I tried to understand it myself but I guess my English is not good
enough... ;-)
Just for the record: I'm trying to follow this path because I do not
want to litter the constructors of the enclosing classes...
Deep regards,
Francesco
P.S.
First posting with Thunderbird... hope it works....
#include <iostream>
#include <set>
#include <algorithm>
#include <functional>
class CDebugBase
{
public:
static void DumpStatic()
{ std::for_each( sSet.begin(), sSet.end(),
std::mem_fun( &CDebugBase::Dump ) ); }
protected:
virtual ~CDebugBase() {}
virtual void Dump() const = 0;
static std::set< CDebugBase * > sSet;
};
std::set< CDebugBase * > CDebugBase::sSet;
//
template< typename T >
class CDebug : private CDebugBase
{
public:
CDebug() { sSet.insert( this ); }
~CDebug() { sSet.erase( this ); }
T const * GetEnclPtr( void ) const
{
CDebug< T > T::* membPtr( &T::mDebugObject );
// IS IT OK?
return reinterpret_cast< T const * >
( this - &( static_cast< T const * >( 0 )->*membPtr ) );
}
void Dump() const
{ std::cout << GetEnclPtr() << " - "
<< typeid( T ).name() << '\n'; }
};
//
struct A
{
CDebug< A > mDebugObject;
};
struct B
{
CDebug< B > mDebugObject;
};
struct Trigger
{
~Trigger( void )
{ std::cout << "-----\n";
CDebugBase::DumpStatic(); }
} trigger;
//
int main()
{
A obj1, obj2, obj3;
B obj4, obj5, obj6;
A * ptr1 = new A[ 5 ];
B * ptr2 = new B[ 5 ];
CDebugBase::DumpStatic();
std::cout << "--------\n";
delete[] ptr1;
delete[] ptr2;
CDebugBase::DumpStatic();
std::cout << "--------\n";
}