| | 352 | template<typename Iterator> |
| | 353 | struct iterator_value_type |
| | 354 | { |
| | 355 | typedef typename iterator_traits<Iterator>::value_type type; |
| | 356 | }; |
| | 357 | |
| | 358 | #ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT |
| | 359 | // Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work |
| | 360 | // out well. Instantiating the nested apply template also |
| | 361 | // requires instantiating iterator_traits on the |
| | 362 | // placeholder. Instead we just specialize it as a metafunction |
| | 363 | // class. |
| | 364 | template<> |
| | 365 | struct iterator_value_type<mpl::_1> |
| | 366 | { |
| | 367 | template <class T> |
| | 368 | struct apply : iterator_value_type<T> {}; |
| | 369 | }; |
| | 370 | #endif |
| | 371 | |
| | 372 | // Metafunction to obtain the type of the tuple whose element types |
| | 373 | // are the reference types of an iterator tuple. |
| | 374 | // |
| | 375 | template<typename IteratorTuple> |
| | 376 | struct tuple_of_value_types |
| | 377 | : tuple_impl_specific::tuple_meta_transform< |
| | 378 | IteratorTuple, |
| | 379 | iterator_value_type<mpl::_1> |
| | 380 | > |
| | 381 | { |
| | 382 | }; |
| | 383 | |