Yes, I have often wondered why those were left out. Several
comments:
1) Sometimes I use Boost::Tuple instead of std::pair just because it has
getters and that makes for_each useable.
2) This would be an excellent point to make when discussing why getters
are good programming.
3) I wrote my own templates to do this, they're very simple.
template
<
typename
P >
typename
P::first_type
const
& const_first_of_pair(P
const
& p) {
return
p.first; }
template
<
typename
P >
typename
P::first_type& first_of_pair(P& p) {
return
p.first; }
template
<
typename
P >
typename
P::second_type
const
& const_second_of_pair(P
const
& p) {
return
p.second; }
template
<
typename
P >
typename
P::second_type& second_of_pair(P& p)
{
return
p.second; }
The const/non-const versions turn out to be necessary in practice.
While you want the const versions for this particular application, there
are other times when the std::pair is mutable and having a non-const
accessor is required.
Use looks like this, for a map where I want to do an internal data update
on each object in an STL container (i.e., call a non-const method on each
value type in the container).
std::for_each(m_lines.begin(), m_lines.end(), bind(&Line::split,
bind(&second_of_pair<container::value_type>, _1)));
Implementation issues:
1) I made them functions instead of functors because I always pass them
to Boost.Bind and functors add weight without benefit in that case.
2) You have to pass in the pair type, not the STL container type, because
I didn't have the energy to write the MPL logic to detect the
"container-ness" of the template argument. I think that could
be done, but I didn't think about it very much.
3) Could Boost.get be extended so that you could use
"get<1,container::value_type>" instead of
"second_of_pair<container::value_type>"?
At 05:04 AM 7/24/2006, gast128 wrote:
Dear all,
in our company we use the STL map frequently. However one often wants to
iterate over the key_type only (or mapped type, or make desicions for the
key
type, and take action on its corresponded map type).
A select1st or select2nd would already a great help.