Boost logo

Boost :

Subject: Re: [boost] [process] The Formal review preiod is nearing the end
From: Nat Goodspeed (nat_at_[hidden])
Date: 2016-11-07 16:14:53


On Mon, Nov 7, 2016 at 12:52 PM, Klemens Morgenstern
<klemens.morgenstern_at_[hidden]> wrote:

> Am 07.11.2016 um 21:09 schrieb Nat Goodspeed:

>> * any_initializer could still be used with any templated initializer
>> type. Isn't that still true?

> You're right, those were templated too. BUT the executor was actually not a
> template, so you could've written on_success(windows::executor& e). That is
> now different. I don't know how a type erasure could be done here, but I
> could write a variant.
> The reason is, that some properties/initializers require access the the
> sequence, mainly to obtain the reference of the io_service.

Please try that? I want a custom initializer to be able to access such
things too.

>> * Klemens states that the machinery needed to write custom
>> initializers is currently in the detail namespace. I want it to be
>> promoted out of the detail namespace: I want support for custom
>> initializers to be a documented, supported feature of the library. If
>> the library is not yet "done" in that respect, then let's consider it
>> again when it's more fully baked.

> Ok, so you have three things you can do: use custom handler for events, as
> in
>
> child c("foo", on_error([](auto & exec, const std::error_code &
> ec){std::cerr << ec.message() << std::endl;});
>
> which is already public & documented (or at least mentioned in the
> documentation).

I saw that, but was misled by the fact that the documentation showed a
nullary lambda.

In any case I'm more interested in a custom initializer that can
self-consistently intercept more than one such event.

> Secondly there is the basic inheritance of "handler"
> (currently private, but needlessly so)
>
> struct foo : boost::process::detail::handler
> {
> template<typename Exec>
> void on_error(Exec & exec, const std::error_code & ec)
> {
> std::cerr << ec.message() << std::endl;}
> };
> };
>
> foo f;
> child c("foo", foo);
>
> This has additional features like async_handler, where you can write an
> on_exit handler etc. and there's a function which get's the passed
> io-service; so it's a bit more rich than in 0.5.

Good! I think you're saying that this feature is stable? Let's just
move it out of "detail."

> Now the third option (and most complicated) would be that you declare a tag
> for a type, provide a builder and a initializer. I won't explain that here
> in detail, but let's say "foo" can be internally constructed from a sequence
> of "bar".
>
> The reason this is not public, is because I'm not sure what should be public
> and what not and I'm not sure if it works as a public interface the way it
> does internally. I think that needs some experience from someone other than
> me, actually implementing an extension, to know that. I didn't think that it
> would've been the best idea to put this in the version of the library to be
> reviewed, especially since I need the experience of someone else. I really
> think it makes much more sense to get the library accepted in its structure
> before we - and by we I mean me and a user, e.g. you, - work out the details
> of the public extension interface.

Then may I suggest a namespace like "experimental" (borrowing a
convention used in recent C++ documents)?

My expectation from other Boost libraries is that I am explicitly
supposed to avoid namespace "detail." The connotation is: hands off!

"experimental" suggests "API is still unstable" while leaving the
feature open for user testing.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk