
Jeremiah Willcock
On Tue, 11 May 2010, joaquin <at> tid.es wrote:
Jeremiah Willcock escribió:
On Mon, 10 May 2010, Richard Webb wrote:
Sounds like the same problem as https://svn.boost.org/trac/boost/ticket/3594
[...]
Hi Jeremiah,
The problem is not a bug with VC++ 10, but a collateral effect of the way std::pair is implemented in the stdlib provided for this compiler --namely, by deriving from an implementation-specific _Pair_base class where the members are actually defined. This reduced test case can help explain the problem:
Could this be viewed as a library issue, then, or is the type of &std::pair::first not considered to be part of the library's interface? It does seem bad that any use of pointers-to-members is fragile to the use of mixins or hidden base classes as part of a class's implementation.
I'm sure there must be valid reasons for the restrictons posed by 14.3.2/5 but I can't see them. I posted about the issue in comp.std.c++ some years ago alas the response was nearly null: http://tinyurl.com/32cdmk8 I might try posting again.
The workaround applied at https://svn.boost.org/trac/boost/ticket/3594 works, but it's probably overkill (and uses the objectionable member_offset, which is really meant to be used as a last resort for legacy compilers). A nicer workaround consists in providing a user-defined key extractor:
[...]
OK. Should that code (for std::pairs) be part of multi_index anywhere? It would seem like other users would use parts of pairs as keys.
I don't feel comfortable with providing such custom key extractors (where should we finish once we start down this path?) On the other hand, specializing boost::multi_index::member when Class is a std::pair might be a good idea. I'll add it to my "to consider" list.
Otherwise, can I copy your code into BGL (under the Boost license)?
Sure, use it freely. You might want to use the specialization variant in anticipation to Boost.MultiIndex providing this specialization itself in the future.
Also, would just a simple cast on the pointer-to-member type work, or are those not allowed in non-type template arguments?
That wouldn't work, you can't cast that way in that context. But if
you don't mind coupling with VC++ 10 stdlib implementation details
you can just use
boost::multi_index::member<
std::_Pair_base
Joaquín M López Muñoz Telefónica, Investigación y Desarrollo