Box< Foo > box*
⟵ zakładam, że to miał być wskaźnik na Box<Foo>
. Wskaźnik nie jest Twoim typem. Nie możesz dla wskaźnika zdefiniować funkcji konwertującej.
Oczywiście. Literówka.
Nie możesz dla wskaźnika zdefiniować funkcji konwertującej.
Ale explicit chyba można? Tak żeby static_cast
zadziałał mimo braku relacji między klasami.
- pisanie wszędzie
new
i delete
miało sens w poprzednim tysiącleciu - czyli już dobre kilka lat temu (to odnośnie samej zmiennej box
, bo do implementacji smart pointera potrzeba),
Jasna sprawa. Gołe new/delete
używam tylko w takich mikro-przykładach.
Func(*box);
Na to bym nie wpadł.
Najlepiej tego NIE ROBIĆ wcale!
A jeszcze lepiej wywalić do kosza Box
i użyć std::unique_ptr
(tam nie zdefiniowali takiego operatora, ale jest metoda get
, która pełni tą rolę).
Ogółem problem polega na tym, że chciałbym w Qt zdefiniować wspólne zachowanie dla różnego rodzaju 'widgetów'. Niezbyt podobała mi się opcja z tworzeniem kolejnych klas dziedziczących a to po QPushButton
, a to po QLineEdit
, etc i przeklejaniem tego samego kodu. Dlatego wpadłem na pomysł, żeby zrobić to raz jako klasę szablonową, która łapałaby odpowiednie eventy i je obsługiwała.
class UIElementBase
{
protected:
QWidget* nativeWidget;
public:
UIElementBase() : nativeWidget( nullptr ) { }
QWidget* GetNativeWidget() const { return nativeWidget; }
operator QWidget*() const { return nativeWidget; }
};
template< typename T >
class UIElement : public QObject, public UIElementBase
{
Q_OBJECT
protected:
QWidget* nativeWidget;
bool event( QWidget* widget, QEvent* event );
void OnEventFocusIn();
void OnEventFocusOut();
void OnEventHoverIn();
/* itd. */
public:
UIElement( UIElementBase* parent = Q_NULLPTR )
{
nativeWidget = new T( parent ? parent : nullptr );
nativeWidget->installEventFilter( this );
}
};
typedef UIElement< QPushButton > UIButton;
typedef UIElement< QLineEdit > UILineEdit;
typedef UIElement< QLabel > UILabel;
Spodobało mi się takie rozwiązanie, tylko było to dość upierdliwe przy korzystaniu z funkcji Qt
, np. przy layoutach. Musiałbym wszędzie klepać coś w stylu
QHBoxLayout* layout = new QHBoxLayout;
UIButton* btn = new UIButton;
layout->addWidget( btn->GetNativeWidget() );
Stąd pomysł konwersji implicit
żeby używać tego naturalny sposób:
layout->addWidget( btn );
Chyba, że jest jakiś lepszy sposób na zdefiniowane wspólnych zachowań dla pewnej grupy klas :P