From qtnode
#ifndef QXTPIMPL_H
#define QXTPIMPL_H
#define QXT_DECLARE_PRIVATE(C) friend class C##Private; QxtPrivateInterface<C, C##Private> qxt_d;
#define QXT_DECLARE_PUBLIC(C) friend class C;
#define QXT_INIT_PRIVATE(C) qxt_d.setPublic(this);
template <typename PUB, typename PVT>
class QxtPrivateInterface {
public:
inline QxtPrivateInterface() { pvt = new PVT; }
inline ~QxtPrivateInterface() { delete pvt; }
inline void setPublic(PUB* pub) { pvt->QXT_setPublic(pub); }
inline PVT& operator()() { return *pvt; }
inline const PVT& operator()() const { return *pvt; }
private:
PVT* pvt;
};
template <typename PUB>
class QxtPrivate {
public:
inline void QXT_setPublic(PUB* pub) { qxt_p_ptr = pub; }
protected:
inline PUB& qxt_p() { return *qxt_p_ptr; }
inline const PUB& qxt_p() const { return *qxt_p_ptr; }
private:
PUB* qxt_p_ptr;
};
#endif