One thing about this bothers me:

Unlike a call to Gtk::manage(), a call to std::move() suggests that we
shouldn't touch the std::unique_ptr<Widget> again. But we have some API
that seems to require that. For instance, we have code in demowindow.cc
that would end up a little like this:

  auto widget = std::make_unique<Button>("some button");
  notebook.append_page(std::move(widget), "something");
  notebook.child_property_tab_expand(*widget) = true;

That would work, but it's scary to use widget after we've called
std::move() on it. This doesn't seem much better:

  auto widget = std::make_unique<Button>("some button");
  Gtk::Widget* widget_to_expand = *widget;
  notebook.append_page(std::move(widget), "something";
 
notebook.child_property_tab_expand(*widget_to_expand) = true;


It would be difficult to change our API to make it unnecessary to ever refer to 
a child Widget* after we've added it to a container.

Murray

On Fri, 2016-02-05 at 14:47 +0100, Murray Cumming wrote:
> The trend in modern C++ is to use std::unique_ptr<> by default to
> express ownership, usually via std::make_unique() (in C++14), insead
> of
> using a raw pointer via a "naked new".
> 
> So, unless you know something else is necessary, this would be good:
>   auto thing = std::make_unique<Thing>();
> instead of this:
>   auto thing = new Thing();
> or
>   Thing* thing = new Thing();
> 
> 
> It's also considered wise to receive a std::unique_ptr as a parameter
> if the method really plans to take ownership. For instance:
>   void Foo::take_thing(std::shared_ptr<Thing> thing);
> 
> 
> So I was wondering if we could use this idea instead of
> Gtk::manage(),
> which has much the same sense of "take ownership", and eventually
> deprecate Gtk::manage().
> 
> Then we could do this, for instance:
>   auto button = std::make_unique<Gtk::Button>("a button");
>   button->show();
>   container.add(std::move(button));
> instead of this:
>   auto button = Gtk::manage(new Gtk::Button>("a button"));
>   button->show();
>   container.add(*button);
> 
> This would work too, I think:
>   container.add(std::make_unique<Gtk::Button>("a button"));
> 
> 
> Then we would be using standard C++ syntax/API instead of custom
> gtkmm
> API.
> 
> 
> However, it would need us to add overloads for methods that currently
> take Widget& parameters. But I think that's doable. For instance:
> 
> void Container::add(std::unique_ptr<Widget> widget)
> {
>   add(*(Gtk::manage(widget.release())));
> }
> 
> 
> Thoughts?
> 
> -- 
> Murray Cumming
> murr...@murrayc.com
> www.murrayc.com
> 
> 
-- 
Murray Cumming
murr...@murrayc.com
www.murrayc.com



_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to