Boost logo

Boost Users :

Subject: Re: [Boost-users] [bind] [multi-index] Create type of pointer to overloaded erase method
From: Peter Barker (newbarker_at_[hidden])
Date: 2008-09-11 02:40:07


On Wed, Sep 10, 2008 at 7:43 PM, JOAQUIN M. LOPEZ MUÑOZ <joaquin_at_[hidden]> wrote:
>
>
> ________________________________________
> De: boost-users-bounces_at_[hidden] [boost-users-bounces_at_[hidden]] En nombre de JOAQUIN M. LOPEZ MUÑOZ [joaquin_at_[hidden]]
> Enviado el: miércoles, 10 de septiembre de 2008 20:34
> Para: boost-users_at_[hidden]
> Asunto: Re: [Boost-users] [bind] [multi-index] Create type of pointer to overloaded erase method
>>
>> ________________________________________
>> De: boost-users-bounces_at_[hidden] [boost-users-bounces_at_[hidden]] En nombre de Steven
>> Watanabe [watanabesj_at_[hidden]]
>> Enviado el: miércoles, 10 de septiembre de 2008 18:54
>> Para: boost-users_at_[hidden]
>> Asunto: Re: [Boost-users] [bind] [multi-index] Create type of pointer to overloaded erase method
>>
>> > AMDG
>> >
>> > Peter Barker wrote:
>> > > RecordsContainer::size_type (RecordsContainer::*erase)(unsigned int) =
>> > > &RecordsContainer::erase;
>> > >
>> > > but it failed to compile. Visual Studio 2003 gives me the following
>> > > error on the above line:
>> > > <snip>
>> > >
>> >
>> > The following compiles for me with msvc 9.0
>> >
>> > int main() {
>> > RecordsContainer::size_type (RecordsContainer::*erase)(unsigned int) =
>> > &RecordsContainer::erase;
>> > }
>>
>> Oddly enough, it fails with MSVC++ 8.0 (though it shouldn't since your
>> call_traits analysis is correct):
>>
>> error C2440: 'initializing' : cannot convert from 'overloaded-function' to
>> 'boost::multi_index::detail::ordered_index<KeyFromValue,Compare,SuperMeta,
>> TagList,Category>::size_type (__thiscall
>> boost::multi_index::multi_index_container<Value,IndexSpecifierList>::* )(unsigned int)'
>
> But the following works:
>
> int main() {
> typedef RecordsContainer::index<RecsByID>::type RecordsContainerByID;
> RecordsContainerByID::size_type (RecordsContainerByID::*erase)(unsigned int) =
> &RecordsContainerByID::erase;
> }
>
> even though my previous approach is IMHO still better.

Both of the your solutions work in VC++ 2003 (7.1). I can understand
your code above - you're going through the index to get at erase().
The previous example I'm having a bit of trouble understanding
though!:

 template<typename Container,typename Key>
 typename Container::size_type container_erase(Container& c,const Key& k)
 {
   return c.erase(k);
 }

 int main() {
   RecordsContainer::size_type (*erase)(RecordsContainer&,const unsigned int&) =
     &container_erase;
 }

I've never seen a function template instantiated like this before. It
appears to be deducing the template parameters based on the type it's
assigning to. It looks very new to me and would like to understand a
bit more.

Sorry - seem to be straying away from Boost here now.

Thanks,

Pete


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net