28 template<
typename _OInterface_>
31 using InterfaceType = _Interface_;
33 Reference(InterfaceType* _interface) : d(
new Private)
35 d->interface = _interface;
42 template<
typename _T_>
45 if(
dynamic_cast<const typename _T_::InterfaceType*
>(interface()))
48 *r.d = *
reinterpret_cast<typename _T_::Private*
>(d);
49 return kCrvSuccess(r);
51 return kCrvError(
"Cannot cast from '{} to '{}'", prettyTypename<InterfaceType>(), prettyTypename<_T_::InterfaceType>());
59 return d and d->interface;
62 const InterfaceType* interface()
const
66 InterfaceType* interface()
71 struct Private :
public QSharedData
73 ~Private() {
delete interface; }
74 InterfaceType*
interface = nullptr;
76 QExplicitlySharedDataPointer<Private> d;