Name für Basisklasse + Typedef gesucht
-
Ich glaube, er meint Template-Parameter, weil nach dem This ein großes T kommt, und betitelt damit die von int(PI*10^?) aufgeworfene Frage auf Seite 1 als ursprüngliche solche.
Und ich find das nicht gut, weil this für mich etwas auf Objektebene Stattfindendes ist und Template-Parameter auf Klassenebene laufen.
-
fdfdg schrieb:
hustbaer schrieb:
Man kann durchaus direkt ableiten. Nur tu' ich es nicht, weil ich es mit der Zwischenbasisklasse praktischer finde.
Das selbe würde sich mit einem Makro erreichen lassen
Auch wenn Makros per se nicht so schön sind, würde ich diese Lösung favorisieren; aber halt nur als einer von etlichen potentiellen Nutzern deiner Library (bin übrigens gespannt, hoffe du schaffst es das durchzuziehen!).
Das typedef könnte man dann ja noch weglassen, statt
Base::dannOwnerDrawControl::oderBaseControl::o.Ä. zu schreiben, wäre ja in Ordnung und direkter ersichtlich. Nennt man das Makro dann noch z.B.CONTROL_IMPL_SHAREDFROMTHIS, ist das ganze IMO ein sehr, sehr verständliches Ding
Weiss nicht ob's noch jmd. interessiert, aber ich hab die Änderung jetzt endlich gemacht.
Sieht jetzt so aus:#define GLAZE_DEFAULT_CONTROL_MEMBERS(THIS_TYPE, BASE_CONTROL) \ public: \ typedef BASE_CONTROL BaseControl; \ \ shared_ptr<THIS_TYPE> shared_from_this() \ { \ ::Glaze::Gui::Detail::AssertControlTypes<THIS_TYPE, BASE_CONTROL>(this); \ return static_pointer_cast<THIS_TYPE>(this->::Glaze::Gui::Control::shared_from_this()); \ } \ \ shared_ptr<THIS_TYPE const> shared_from_this() const \ { \ ::Glaze::Gui::Detail::AssertControlTypes<THIS_TYPE, BASE_CONTROL>(this); \ return static_pointer_cast<THIS_TYPE const>(this->::Glaze::Gui::Control::shared_from_this()); \ } \ \ private: \ // end GLAZE_DEFAULT_CONTROL_MEMBERS ///////////////////////////////////////////////////////////////////////////// namespace Detail { //! Helper function for GLAZE_DEFAULT_CONTROL_MEMBERS macro template <class THIS_TYPE, class BASE_CONTROL, class T> inline void AssertControlTypes(T const*) { BOOST_STATIC_ASSERT(::boost::is_same<T BOOST_PP_COMMA() THIS_TYPE>::value); BOOST_STATIC_ASSERT(::boost::is_base_and_derived<BASE_CONTROL BOOST_PP_COMMA() THIS_TYPE>::value); } } // namespace Detail("Glaze" ist der Name der Library)
Netter Nebeneffekt: die Doxygen Doku ist nun wieder "hübsch".