|
Boost : |
Subject: Re: [boost] [iterator] Using zip_iterator with std::pair
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2012-10-18 09:00:40
On Thu, Oct 18, 2012 at 3:11 AM, "Claas H. Köhler" <claas.koehler_at_[hidden]>wrote:
>
>
> On 17/10/12 13:21, Jeffrey Lee Hellrung, Jr. wrote:
> > On Wed, Oct 17, 2012 at 12:08 AM, "Claas H. Köhler" <
> claas.koehler_at_[hidden]>wrote:
> >
> >>
> >>
> >> On 17/10/12 04:28, Jeffrey Lee Hellrung, Jr. wrote:
> >>> On Tue, Oct 16, 2012 at 10:06 AM, "Claas H. Köhler" <
> >> claas.koehler_at_[hidden]>wrote:
> >>>
> >>>>
> >>>>
> >>>> On 16/10/12 14:27, Jeffrey Lee Hellrung, Jr. wrote:
> >>>>> On Tue, Oct 16, 2012 at 4:21 AM, "Claas H. Köhler" <
> >> claas.koehler_at_[hidden]
> >>>>> wrote:
> >>>>>
> >>>>>>
> >>>>>>
> >>>>>> On 16/10/12 12:01, Giovanni Piero Deretta wrote:
> >>>>>>> On Tue, Oct 16, 2012 at 9:06 AM, "Claas H. Köhler" <
> >>>> claas.koehler_at_[hidden]>
> >>>>>> wrote:
> >>>>>>>> Hi!
> >>>>>>>>
> >>>>>>>> I would like to use the boost::zip_iterator with std::pair.
> >>>>>> Unfortunately this does not work out of
> >>>>>>>> the box, but there exists a namespace
> >>>>>> boost::detail::tuple_impl_specific, which apparently needs to
> >>>>>>>> be specialised for each tuple type.
> >>>>>>
> >>>>>
> >>>>> Hmmm...I guess it makes sense you might have to specialize something
> if
> >>>>> zip_iterator doesn't specifically know about your desired tuple type.
> >>>>>
> >>>>>
> >>>>>>>> I managed to re-implement tuple_meta_transform and
> >>>>>> tuple_meta_accumulate for std::tuple, which seems
> >>>>>>>> to be straightforward. However, there are functions of the form
> >>>>>>>>
> >>>>>>>> template<typename Tuple, typename Fun>
> >>>>>>>> complex_result_type tuple_transform(const Tuple&, Fun)
> >>>>>>>>
> >>>>>>>> which have to be overloaded as well, if I am not mistaken.
> However,
> >>>>>> overloading this with something like
> >>>>>>>> template<typename... Args, typename Fun>
> >>>>>>>> complex_result_type tuple_transform(const std::tuple<Args...>&,
> Fun)
> >>>>>>>>
> >>>>>>>> is probably not going to work, since this would be a partial
> >> template
> >>>>>> specialisation of a function.
> >>>>>>>
> >>>>>>> That's an overload actually and should work fine. Did you try it?
> >>>>>>>
> >>>>>>> HTH,
> >>>>>>
> >>>>>> Thanks for the hint. I have to admit I did not try it yet. I have
> just
> >>>>>> created a similar simple test
> >>>>>> case, which indeed compiles/works fine. Shame on me for not trying
> it
> >>>> out.
> >>>>>> For me this was always a
> >>>>>> classical example of template function specialisation. I guess I
> >> should
> >>>>>> take a look at template
> >>>>>> basics again :-)
> >>>>>>
> >>>>>> Sorry for that and thanks for the quick response.
> >>>>>>
> >>>>>
> >>>>> I'm glad you got it working, but ideally, I think, zip_iterator
> should
> >>>> work
> >>>>> out of the box for std::pair and std::tuple. Could I trouble you to
> >>>> provide
> >>>>> patches based on what you needed to get this to work?
> >>>>>
> >>>>> - Jeff
> >>>>
> >>>> Unfortunately things are not working yet. As far as I can judge, the
> >>>> problem is that some of the
> >>>> functions are called from within the zip_iterator.hpp header file,
> which
> >>>> is before I can actually
> >>>> define the overloaded functions. As a result the overloaded functions
> >> are
> >>>> not called.
> >>>>
> >>>> Should I get this working, however, I am glad to share the wisdom.
> >>>>
> >>>
> >>> Well, I'd consider it fair game to edit the zip_iterator.hpp header
> file
> >>> directly :)
> >>>
> >>> - Jeff
> >>>
> >> Looks like I found a working solution. I transformed the tuple_xxx
> >> template functions into template
> >> structs, for which overloading seemingly works fine. Since I am not
> >> familiar with boost::mpl I used
> >> my own versions of the meta transformations based on C++11. For tuple
> this
> >> may not be an issue, since
> >> its a C++11 feature, but for std::pair it could be.
> >>
> >> Furthermore I would suggest to implement these functions exclusively for
> >> boost::tuple and leave the
> >> general template unimplemented. This may ease specialisations of other
> >> classes. Using C++11 for
> >> example the specialisations for std::pair and std::tuple are almost
> >> identical, but have to be
> >> specialised individually. Just my 0.02$ .
> >>
> >> Shall I post the modified code directly to the mailing list or somewhere
> >> else?
> >>
> >
> > Create a trac ticket, attach any patches, and I'll take a look at it
> when I
> > get a chance.
> >
> > - Jeff
> >
> I just created ticket #7526 with a proposed patch. I am not sure, whether
> I got the different
> compiler macros right, though, since I do not have access to the compilers
> they are intented for.
> Furthermore you may want to enclose the std::tuple stuff (including
> namespace helper) into a macro,
> which enables it if C++11 is used (I presume such a macro does already
> exist, but I did not know its
> exact syntax).
>
Great, thanks! I'll try to get to this before 1.53.0 is released. Did you
add a unit test by chance?
As for conditioning on the existence of std::tuple, looks like
BOOST_NO_CXX11_HDR_TUPLE and BOOST_HAS_TR1_TUPLE would be macros to use.
- Jeff
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk