30 template<
typename _OInterface_>
33 using InterfaceType = _Interface_;
35 Reference(InterfaceType* _interface) : d(
new Private) { d->interface = _interface; }
41 template<
typename _T_>
42 cres_qresult<_T_> cast()
const
44 if(
dynamic_cast<const typename _T_::InterfaceType*
>(interface()))
48 = *
reinterpret_cast<typename _T_::Private*
>(d);
49 return cres_success(r);
53 return cres_failure(
"Cannot cast from '{} to '{}'", prettyTypename<InterfaceType>(),
54 prettyTypename<_T_::InterfaceType>());
60 bool isValid()
const {
return d and d->interface; }
62 const InterfaceType* interface()
const {
return d->interface; }
63 InterfaceType* interface() {
return d->interface; }
65 struct Private :
public QSharedData
67 ~Private() {
delete interface; }
68 InterfaceType*
interface = nullptr;
70 QExplicitlySharedDataPointer<Private> d;