Boost Users :
Subject: Re: [Boost-users] Tag dispatching
From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2009-03-04 08:12:09
please see my comments below:
On Wed, Mar 4, 2009 at 1:54 PM, Hicham Mouline <hicham_at_[hidden]> wrote:
> I have a question about tag dispatching (for e.g. the std::advance()
> function in the std lib, as described for instance in
> 1. The call to
> detail::advance_dispatch(i, n, category);
> I don't understand. category is a type not an object, it should be
> category(), right?
typename *iterator_traits<InputIterator>::iterator_category* category;
detail::advance_dispatch(i, n, *category*);
here is no typedef used, so category is an instance of iterator_category. In
the template context you have to prefix it with typename keyword. Using:
typename *iterator_traits<InputIterator>::iterator_category* category();
declares a function, which returns iterator_category, but does not create a
> 2. If I am correct,
> the tags are empty structs which I assume allows modern compilers
> (g++4, msvc8/9, intel) to optimize away the creation of that category
> object ?
This is compiler dependent. ISO C++ 03 standard requires an instance of an
empty type to be at least 1 byte big. To check if that happens read the
documentation to the corresponding compiler.
> 3. If i am still correct, I have a tag which has no members except 1 static
> function that returns void.
> Would that optimization still apply?
Applies the same as in 2.
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