Boost logo

Boost :

Subject: Re: [boost] [iterator] Using zip_iterator with std::pair
From: Claas H. Köhler (claas.koehler_at_[hidden])
Date: 2012-10-17 03:08:08


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?

Regards
Claas


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