Re: Overloaded constructors and cast operators for Glib::Value?
- From: Murray Cumming <murrayc murrayc com>
- To: Jan Hudec <bulb ucw cz>
- Cc: gtkmm-list <gtkmm-list gnome org>
- Subject: Re: Overloaded constructors and cast operators for Glib::Value?
- Date: Fri, 07 Jan 2005 21:07:09 +0100
On Fri, 2005-01-07 at 20:26 +0100, Jan Hudec wrote:
> Hello All,
>
> I am planning a project. It's in a design stage. For that project,
> I need a generic value type.
>
> By that I mean, that it should be possible to construct that type from
> any (some reasonable set) other type and be castable to any such type,
> perhaps using dynamic_cast method like RefPtr does. This cast or method
> would throw bad_cast, if the object actualy contained incompatible type.
>
> What I want is to allow:
>
> void foo(int x);
>
> Value a = 1;
> Value b = "string";
>
> foo(a); // OK, a is an integer
> foo(b); // throws bad_cast, because it's not a number.
>
> Since I will be passing that type to Gtkmm calls a lot, I want it
> convertible to Glib::ValueBase.
Glib::Value and Glib::ValueBase base are used only rarely in the gtkmm
API, so this would not be a big advantage.
However, I can see the advantage of reusing the existing code.
> Thus I thought that it could in fact be
> based on the existing Glib::Value infrastructure.
>
> I thought about something like this:
>
> class Value : Glib::ValueBase {
> protected:
> void swap(Value &that)
> {
> GValue tmp;
> tmp = that.gobject_;
> that.gobject_ = this->gobject_;
> this->gobject_ = tmp;
> }
> public:
> // some not-interesting default constructor
>
> // template constructor from anything
> template <class VT> Value(VT &val)
> {
> Glib::Value<VT> tmp;
> tmp.set(val);
> this->swap(tmp);
> }
> template <> Value(Glib::ValueBase &val) :
> Glib::ValueBase(val)
> {};
>
> // operator= using above constructors and swap
>
> // And now the highest madness! The cast operators!
> // FIXME This won't work. It does not do sane checking.
> template <class VT> operator VT()
> {
> Glib::Value<VT> tmp;
> tmp = *this; // FIXME This does not exist!
> return tmp.get();
> }
>
> // Perhaps some more operations should be defined too, like
> // a stringification operation for printing and such.
> }
>
> The FIXME denotes the point where I am in trouble. What I need is an
> operation, that would copy one Glib::ValueBase to a Glib::ValueBase
> descendant calling g_value_transform and throwing a bad_cast exception
> if it returns NULL.
>
> I think it should be possible to implement the operation here -- after
> all, it inherits Glib::ValueBase and thus has access to it's guts. I am
> nowever not completely sure HOW it should be done. What are your
> opinions on this?
>
> Also it does not work with enums and flags, because enums are
> Glib::Value_Enum and flags are Glib::Value_Flags. It would suffice to
> use static constructor methods for enums. Does anyone have a better
> idea?
>
> Since I don't have much experience with C++, it's quite possible that
> there are other bugs too. Please correct me if I am wrong somewhere.
>
> -------------------------------------------------------------------------------
> Jan 'Bulb' Hudec <bulb ucw cz>
> _______________________________________________
> gtkmm-list mailing list
> gtkmm-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkmm-list
--
Murray Cumming
murrayc murrayc com
www.murrayc.com
www.openismus.com
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]