#define self (*this)
#define ForEach(cont, it) \
for(__typeof__((cont).begin()) it = (cont).begin(); it != (cont).end(); ++it)
E é claro, todo programador C++ que se preze faz seu próprio smart pointer caseiro:
#undef __DANGEROUS__
templateclass PtrRef;
templateclass Ptr
{
public:
inline Ptr()
{
payload = new PtrRef(0);
}
inline Ptr(TIPO* parg)
{
payload = new PtrRef(parg);
}
inline Ptr(const Ptr& arg)
{
payload = arg.payload;
++payload->referencias;
}
inline Ptr& operator=(const Ptr& outro)
{
++outro.payload->referencias;
if(--payload->referencias == 0) {
delete payload;
}
payload = outro.payload;
return *this;
}
inline ~Ptr()
{
if (--payload->referencias == 0) {
delete payload;
payload = 0;
}
}
inline TIPO* operator->() const
{
return payload->ponteiro;
}
inline TIPO& operator*() const
{
return *(payload->ponteiro);
}
inline bool operator!() const
{
return (payload->ponteiro == 0);
}
inline operator bool() const
{
return (payload->ponteiro != 0);
}
inline TIPO* pointer() const
{
return payload->ponteiro;
}
#ifdef __DANGEROUS__
inline operator TIPO*() const
{
return pointer();
}
#endif
private:
PtrRef* payload;
};
templateclass PtrRef
{
inline PtrRef(TIPO* p)
{
ponteiro = p;
referencias = 1;
}
inline ~PtrRef()
{
delete ponteiro;
ponteiro = 0;
}
TIPO* ponteiro;
unsigned int referencias;
friend class Ptr;
};
Depois o sujeito tem de tomar remédio de doido já aos 30 anos e não sabe por quê...